如何扩展/构建ASP.NET MVC 3授权属性来处理此方案

时间:2011-02-26 00:12:25

标签: asp.net-mvc authorize

我一直在努力思考这个问题,并且找不到如何正确解决这个问题的好方法。

我已阅读过这些文章
http://schotime.net/blog/index.php/2009/02/17/custom-authorization-with-aspnet-mvc/
http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx
ASP.NET MVC custom authorization
http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx
Custom Authorize Attribute additional Param?

思考也许最后一个很接近。


方案:

  • 用户创建角色
  • 用户可以指定角色有权访问的内容。
  • 用户将用户添加到这些角色中
  • 用户也是部门的一部分

所以在控制器中我怎么能说用户有权访问某个动作,因为我不知道用户管理员创建了哪些角色?

所以在逻辑中...假设我有一个带有“创建”,“详细信息”的任务控制器。该任务有一个“服装”部门。

  • 任务:
    - TaskID
    - 任务标题
    - TaskDepartmentID

  • - 用户:
    - 用户名
    - 角色
    - 部门

    我会以某种方式将“创建”操作与“创建任务”能力相关联 我会以某种方式将“详细信息”操作与“查看任务详细信息”能力相关联

管理员会添加一个名为“任务用户”的新角色,并说这个角色可以“创建任务” 管理员还允许此角色“查看任务详细信息”
管理员将打开“部门级别安全”


创建
当在控制器上调用Task Create时,我需要确保用户处于允许“Create Task”的角色中。因此,默认情况下,我无法将允许的“角色”发送到授权属性,因为我不知道它们。我不知何故需要发送用户拥有的所有角色,看看角色是否有权访问“创建任务”

使用部门安全性查看:
当另一个用户去查看此任务时,他们可以访问“查看任务详细信息”(我可以弄清楚但是我解决了第一个问题)。但是,由于任务是针对他们所在的其他部门,我需要拒绝访问。如果任务是用户所在部门之一,则用户只能“查看任务详细信息”。

这是我无法弄清楚的。如何正确扩展AuthorizeAttribute以便我可以通过GerRolesForUser发送角色列表,因为它只接受一个字符串,以及如何识别它的操作,然后通过检查部门ID来限制另一个级别的安全性。

部门ID不一定要被缓存,所以我可以在控制器级别这样做。

2 个答案:

答案 0 :(得分:1)

我有一些类似的问题,我没有使用授权属性。

相反,我决定扩展Controller类并覆盖OnActionExecuting的实现。在我的实现中,我可以执行所有检查,例如哪个部门用户属于哪个,以及他是否足够好以查看其他部门的数据。看看这种方法是否适合您。

答案 1 :(得分:1)

我有一些类似的问题,我没有使用授权属性。

相反,我决定为不同的用户采用不同的-2布局。

如果用户是管理员,那么他将转到不同的视图,如果用户是访客,他将通过不同的布局转到不同的视图。