我一直在努力思考这个答案,但找不到一个很好的解决方案来正确地做到这一点。
我已经阅读了这些文章:
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 自定义授权
http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute .aspx
自定义授权属性附加参数?
想也许最后一个很接近。
设想:
- 用户创建角色
- 用户可以分配角色有权执行的操作。
- 用户将用户添加到这些角色
- 用户也是部门的一部分。
那么在控制器中,我怎么能说用户可以访问操作,因为我不知道用户管理员创建的角色是什么?
所以在逻辑上......假设我有一个带有“创建”、“详细信息”的任务控制器。该任务有一个“服装”部门。
- 任务:
--TaskID
--TaskTitle
--TaskDepartmentID
- -- 用户:
-- 用户名
-- 角色
-- 部门
我会以某种方式将“创建”操作与“创建任务”功能
相关联 我会以某种方式将“详细信息”操作与“查看任务详细信息”功能相关联
管理员将添加一个名为“任务用户”的新角色,并说此角色可以“创建任务”
管理员还允许此角色“查看任务详细信息”
管理员将打开“部门级安全性”
创建:
任务创建时在控制器上调用我需要确保用户处于允许“创建任务”的角色中。因此,默认情况下,我无法将允许的“角色”发送到授权属性中,因为我不知道它们。我需要以某种方式发送用户拥有的所有角色,并查看角色是否有权
使用部门安全查看“创建任务”:
当另一个用户查看此任务时,他们可能有权访问“查看任务详细信息”(我可以弄清楚但我解决了第一个问题)。但是,由于任务是针对他们所在部门以外的另一个部门,我需要拒绝访问。如果任务是用户所在部门之一的一部分,则用户只能“查看任务详细信息”。
这是我无法弄清楚的。如何正确扩展 AuthorizeAttribute 以便我可以通过 GerRolesForUser 发送角色列表,因为它只接受一个字符串,以及如何识别它用于什么操作,然后通过检查部门 ID 在另一个级别上限制安全性。
部门 ID 不一定要被缓存,所以也许我可以在控制器级别做到这一点。