如何在asp.net成员资格中最好地处理权限(而不是角色),特别是在ASP.NET MVC中

Jos*_*yes 11 asp.net-mvc asp.net-membership asp.net-authentication asp.net-roles

有很多关于设置asp.net成员资格,角色提供者等的问题(和信息).您是否应该使用microsoft提供的内置平台,或者角色扩展您自己的基类和角色.

我决定扩展默认提供程序并实现我自己的成员资格和角色提供程序.现在我的问题,特别是围绕角色身份验证.

传统上,您可以创建角色,例如"经理,管理员,员工,超级用户"或任何您拥有的角色.但是对于我认为是更精细控制的权限,您应该/应该做什么?让我详细说明......

在我的asp.net mvc网站中,我有不同的领域,如管理,管理,消息传递,报告等.我会为"管理员","经理","报告者"等各个角色创建角色.如果没有相应的角色,您可以无法访问该网站的该区域.所以我会在类级别锁定整个控制器.

但现在以一个地区为例; 消息,并说我想为CRUD获得更好的谷物权限; 创建消息,查看/阅读消息,编辑消息,删除消息等.

最后我的问题.如何实现这种更精细的控制?我看到的一种方法(不确定它是否是一个好方法),就是为所有东西创建asp.net成员角色.所以我可能......

Messenger(广义级角色),CreateMessage,ReadMessage,EditMessage,DeleteMessage.

一方面,我希望一些用户能够阅读/查看消息.但不一定要创建或删除它们.单个控制器操作可以应用特定角色.

你觉得这种方法有什么问题吗?你有更好的主意吗?

迄今解决方案

我决定创建自己的架构并实现自定义成员资格和角色提供程序.我的架构包括;

  • 用户
  • 用户资料
  • 允许
  • PermissionAssignment
  • 角色
  • RoleAssignment

将在第二天或第二天离开,但是当我有机会时会更新更多信息.

JOB*_*OBG 5

我想你应该忘记的授权机制的作用,要求授权,而不是(在最后一个角色是权限的agrupation),所以如果你看这样的说法,你的Authorize属性应该问一个实体和动作,而不是一特别的角色.就像是:

[Authorize(Entities.Message, Actions.Create)]
public ActionResult CreateMessage()

[Authorize(Entities.Message, Actions.Edit)]
public ActionResult EditMessage()

[Authorize(Entities.Message, Actions.View)]
public ActionResult ViewMessage()
Run Code Online (Sandbox Code Playgroud)

这样,你的角色,做自己,而不是确定访问级别的不灵活的方式最好的,抽象的权限集合.

编辑:为了处理像David Robbins指出的特定规则,管理员A不允许删除管理员B创建的消息,假设他们都具有访问此控制器操作所需的权限,授权人不负责检查此类型的规则,即使你试图在Action Filter级别检查它也会很痛苦,所以你可以做的是将Authorize验证扩展到ActionResult(注入一个包含验证结果的action参数),然后让ActionResult生成在那里做出逻辑决定并提出所有论据.

是一个类似的问题,并不完全是这里指出的情况,但它是使用Action Parameters扩展Authorize验证的一个很好的起点.