ASP.NET MVC授权:角色位置的权限

Nic*_*sen 21 asp.net permissions asp.net-mvc authorization

我知道这是一个经常被问过的问题,但我试图在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角色并添加所有角色.

有没有人以这种方式实现系统?任何关于这种方法的意见或想法将不胜感激.

谢谢

The*_*Sky 4

我同意 @jlew 关于缓存用户数据以及当缓存过期时 - 只需重新加载它即可。尝试强制这些数据保持持久性是没有用的。此外,如果您想放弃 ASP.net 角色提供程序,您可以按照我在本回复中所述的方式部署自己的安全性。这样做的优点是允许针对角色/个人权限使用非常自定义的安全解决方案。

以下只是我最近一直在尝试的一个想法(只是一些值得深思的东西)。为什么不使用 MVC 的 RESTful url 来定义“权限”。例如:

/tasks/add可以定义添加任务的权限。这些可以以某种方式分层,以便为用户授予 的权限/tasks/add也授予他们 的权限/tasks。然后,您可以使用全局操作过滤器来构建给定路由值的 URL。这也将允许通过运行时配置单个项目安全性的非常有趣的方法。例如,/tasks/edit/23可以以某种方式授予 id 任务的编辑权限23。不管怎样,这可能根本没有帮助……但这只是我认为你可能会考虑一下。

干杯!