ASP.NET MVC授权:代替角色的权限

我知道这是一个反复提出的问题,但我试图在ASP.NET MVC应用程序中实现基于权限而不是基于角色的授权。 因此,我不需要像Manager,Admin或User这样的高级角色,而需要像ViewTask,AddTask,DeleteTask这样的权限。 我已阅读了大量关于此的评论,似乎最简单的解决方案是将角色视为权限并定义ViewTask,AddTask和DeleteTask的“角色”。

这样的方法真的是一个好主意吗? 我担心的一些问题是,根据应用程序的大小,您最终可能会拥有超过100个角色,从而排除了在Cookie中执行角色缓存的能力,因此每次调用User.IsInRole都会触发数据库。 如果每个操作方法都要用[Authorize(Roles =“XXXX”)]来装饰,我会看到严重的性能问题吗?

我的另一个问题是,我仍然希望保持角色的概念,以便管理员可以简单地将用户与具有预定义权限集的角色相关联。 使用上述方法,我的想法是在名为Group的应用程序中创建一个单独的实体,该Group将负责跟踪分配给该组的ASP.NET角色。 因此,当用户与组关联时,我可以检索需要分配给用户的ASP.NET角色并添加所有角色。

有没有人以这种方式实施系统? 对这种方法的任何意见或想法,将不胜感激。

谢谢


我同意@jlew关于缓存用户数据以及缓存何时到期 - 只需重新加载。 试图强制这些数据保持不变是没有用的。 另外,如果你想离开ASP.net角色提供者,你可以推出你自己的安全性,正如我在本回复中所描述的那样。 这具有为角色/个人权限提供非常自定义的安全解决方案的优势。

以下是我最近一直在玩的一个想法(仅供参考)。 为什么不使用MVC的RESTful URL来定义“权限”。 例如:

/tasks/add可以定义添加任务的权限。 这些可以在某种程度上是分层的,这样在/tasks/add上授予用户权限也赋予它们/tasks上的权限。 然后,您可以使用全局操作筛选器,该筛选器会根据路由值生成URL。 这也可以为通过运行时配置单个项目安全性提供真正有趣的方法。 例如, /tasks/edit/23可以以某种方式授予编号为23任务的编辑权限。 无论如何,这可能甚至不会对你有所帮助......但这只是我以为我想你可能会考虑。

干杯!


我们通过在服务器端缓存委托人来解决问题,这样“许可角色”就不需要存放在cookie中,我们也不必在每个请求上重新加载。 实际上,您可以通过将Cookie数据分块为多个Cookie来解决Cookie大小限制(Windows Identity Framework可以实现这一点)。但是,您可能会对带宽较大的Cookie产生带宽或其他问题。

链接地址: http://www.djcxy.com/p/15965.html

上一篇: ASP.NET MVC Authorization: Permissions in Place of Roles

下一篇: C# cookie based authorization