asp.net-mvc - 防止授权用户编辑不属于他的数据

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

我已经阅读了十几个关于 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/

相关文章:

c# - ASP.NET MVC4,将 View 映射到具有多种具体类型的枚举

c# - 如何使用状态代码设置自定义异常

asp.net-mvc - WebApiConfig.cs 和 RouteConfig.cs 之间的区别

c# - 查询更新我所有的数据,而不是只更新我想要的数据

sql-server - SQL Server DISTINCT 和 GROUP BY 仍然返回重复项(子查询格式)

c# - foreach 中的删除线文本?

asp.net-mvc - Kendo UI 调度程序 : Custom view and edit behavior

javascript - onclick 验证不会停止 POST 到 MVC Controller

python - Django-Cities-Light,在 postgresql 中将字段更改为foreignkey会引发错误

c# - 使用 knockout 填充文本框 "data-bind=click"