我已经阅读了十几个关于 ASP.NET MVC 中的自定义授权过滤器的问题,但没有一个能解决我的想法。
这是设置:
- ASP.NET MVC 4 项目
- UserProfiles 存储在数据库 (EF5) 中,并通过 WebSecurity.InitializeDatabaseConnection 链接到 SimpleMembershipProvider。所以我总能得到一个基于 User.Identity.Name 的 UserProfile
- 每个用户实体都有一个一对多关系的 BlogPost 集合。
- 每个 BlogPost 通过 UserProfile 属性“知道”拥有它的用户(感谢 EF!)。
假设 John 试图访问 http://mysite.com/BlogPosts/Edit/5第 5 条 BlogPost 是 Mary 的博客文章。 John 已登录并通过了内置授权方案,因此获得了授权,但他无权编辑 Mary 的 blos 帖子。我希望你能明白这张照片。
我了解 ASP.NET MVC 中的授权,我知道我可以构建自己的自定义 IAuthorizationFilter。但是,我的授权过滤器必须访问数据库(在我的例子中是 DbContext),以检查正在编辑/删除的实体是否为当前登录用户所有,即 BlogPost 编号 5。也就是说,当前登录的用户只能编辑和删除他的“东西”。每个“东西”都知道拥有它的用户。
伪代码是这样的:
var currentlyLoggedUser = this.dbContext.UserProfiles.Single(user => user.Username == this.User.Identity.Name);
if (blogPost.UserProfile != currentlyLoggedUser)
{
// "John you are not allowed to edit someone else's blog post, you bad boy".
}
那么,我的两个简单问题是: 1. 从自定义 IAuthorizationFilter 中访问数据库 的“最佳实践”方式是什么?我是否应该以某种方式将我的 IRepository(为我的 DbContext 服务的接口(interface))注入(inject)授权过滤器属性?我应该尝试从我的过滤器的 OnAuthorization 方法中的 Controller 中找到我的 IRepository 吗?首先从过滤器中访问数据库是否可以? 2. 如果为此任务使用 IAuthorizationFilter 不是执行此操作的“最佳实践”方法,那么什么才是?
总结一下:
如果每个“资料”都知道拥有它的用户,我如何确保当前登录的用户只能编辑/删除他的“资料”?
最佳答案
同时查看 BlogEngine.NET 的源代码和 DotNetNuke
每个帖子条目都应该有一个 post_author_id 或 post_owner_id。因此,通过计算此 ID 和登录用户的 ID,您可以有效地显示/隐藏编辑选项。
public class HomeController : Controller
{
public ActionResult Edit(int id)
{
var post = _service.GetPost(id);
var currentUser = this.dbContext.UserProfiles.Single(user => user.Username == this.User.Identity.Name);
if(post.OwnerId == currentUser.Id)
{
// Let him edit, hes the owner of the post.
return View(post);
}
else
{
// send him back to the post or do something else.
return RedirectToAction("Post", "Home");
}
}
}
关于asp.net-mvc - 防止授权用户编辑不属于他的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13084523/