我已经阅读了十几个关于 ASP.NET MVC 中的自定义授权过滤器的问题,但没有一个能解决我的想法。
这是设置:
- ASP.NET MVC 4 项目
- UserProfiles 存储在 DB (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),以检查正在编辑/删除的实体,即第 5 号 BlogPost 是否由当前登录的用户拥有。换句话说,当前登录的用户只能编辑和删除他的“东西”。每个“东西”都知道拥有它的用户。
在伪代码中是这样的:
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 服务的接口)注入到授权过滤器属性中吗?我应该尝试从我的过滤器的 OnAuthorization 方法中从控制器中找到我的 IRepository 吗?首先可以从过滤器中访问数据库吗?2. 如果为此任务使用 IAuthorizationFilter 不是执行此操作的“最佳实践”方式,那是什么?
所以总结一下:
如果每个“东西”都知道拥有它的用户,我如何确保当前登录的用户只能编辑/删除他的“东西”?