4

我已经阅读了十几个关于 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 不是执行此操作的“最佳实践”方式,那是什么?

所以总结一下:

如果每个“东西”都知道拥有它的用户,我如何确保当前登录的用户只能编辑/删除他的“东西”?

4

1 回答 1

0

还要浏览BlogEngine.NETDotNetNuke的源代码

每个帖子条目都应该有一个 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");
        }
    }
}
于 2012-10-26T09:49:13.623 回答