2014-09-23 42 views
7

有没有人有任何关于强制记录级授权,同时保持ASP.Net MVC网站内的关注点分离的好方法的建议?MVC/ASP.Net记录级授权的最佳实践

用的PrincipalPermission,您可以装饰的方法有:

PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader") 

要求对任何游客到该页面是固定的作用“GroupLeader”中的一员。

或者,你可以装饰用的方法:

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")] 

要求对任何游客到该页面被允许一般管理一组。

但是,这些都不能解决用户可能有权编辑某些组的情况,而不是其他情况。据我所知,即使我实现了自定义ClaimsAuthorizationManager,也无法访问方法参数以执行条件授权。

此外,上述两种方法只是抛出一个SecurityException如果用户没有访问,而不是允许的方法向用户正常重定向到解释发生了什么,他们可能会做,以获得必要的授权什么页面。很明显,我也意识到我可以将授权逻辑编码到方法本身并进行相应的重定向,但我宁愿将其分开,并尽可能保持方法代码的清洁,以便仅处理实际处理请求,并且还处理能够在一个更通用的框架内工作。

那么,是否有一个“开箱即用”的方式来处理这种情况,或者我必须实现一个自定义的IAuthorizationFilter?我认为我可以处理记录级别的授权和优雅的重定向,但是在方法级别没有任何参数,它本质上将是一个庞大的if ... else if声明。

+0

没有什么开箱即可,但你不应该需要一个巨大的'如果其他'。在授权过滤器中,您自己有请求,所以您可以从那里获取内容。 – Shoe 2014-09-23 15:23:15

+0

你真的问的问题是“我可以在_this_对象上执行操作吗?”实际上我正在做一些与此相关的搜索,但我还没有遇到一个好的解决方案。基本上,你想[自主访问控制](http://en.wikipedia.org/wiki/Discretionary_access_control)。维基百科描述了它,但我还没有找到具体的编程模式。“自主访问控制”就像是答案,但我需要更多的研究,因为它主要关注系统资源(例如文件系统或计算机)。 – 2014-09-23 16:41:08

回答

1

处理这种情况最直接的方法是在您的实体上创建一个属性,以存储实体的“所有者”或“创建者”。然后,当您查询对象时,按此过滤。例如:

public class Foo 
{ 
    public int Id { get; set; } 

    ... 

    public string Creator { get; set; } 
} 

然后:

public ActionResult FooDetails(int id) 
{ 
    var foo = db.Foos.SingleOrDefault(m => m.Id == id && m.Creator == User.Identity.Name); 
    if (foo == null) 
    { 
     return new HttpNotFoundResult(); 
    } 

    return View(foo); 
} 

这不是真的适合通过授权过滤器,因为你必须选择该行,以确定用户的权限来处理这个问题。然后,您必须在动作中再次选择行以将其发送到视图。此外,你必须做一些杂技,让过滤器能够知道它应该从哪里选择什么,以便你甚至可以首先检查权限。在这个动作中,你已经选择了实体,所以只要根据用户是否同时“拥有”来调整它。