防止授权用户编辑不属于他的数据

时间:2012-10-26 09:43:57

标签: asp.net-mvc database asp.net-mvc-4 authorization

我已经阅读了有关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,而BlogPost 5号是Mary的博客文章。约翰被授权,因为他已登录并通过了内置的授权方案,但他无权编辑Mary的blos帖子。我希望你能得到这张照片。

我知道ASP.NET MVC中的授权,我知道我可以构建自己的自定义IAuthorizationFilter。但是,我的授权过滤器必须访问数据库(在我的情况下是DbContext),以检查正在编辑/删除的实体,即BlogPost编号5是否由当前登录的用户拥有。换句话说,当前登录的用户只能编辑和删除他的“东西”。每个“东西”都知道拥有它的用户。

pseude代码中有类似的内容:

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方法中的Controller中找到我的IRepository吗?首先从过滤器中访问数据库是否可以? 2.如果使用IAuthorizationFilter执行此任务不是“最佳实践”方法,那么它是什么?

总结一下:

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

1 个答案:

答案 0 :(得分: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");
        }
    }
}