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

Asp.net mvc 如何最好地处理asp.net成员资格中的权限(而不是角色),特别是在asp.net MVC中,asp.net-mvc,asp.net-membership,asp.net-roles,asp.net-authentication,Asp.net Mvc,Asp.net Membership,Asp.net Roles,Asp.net Authentication,关于设置asp.net成员资格、角色提供程序等,有很多问题(和信息)。您是否应该使用microsoft提供的内置平台,或者角色扩展您自己的基类和角色 我已决定扩展默认提供程序,并实现我自己的成员资格和角色提供程序。现在我的问题是关于角色身份验证的 传统上,您可能会创建诸如“经理、管理员、员工、超级用户”或其他角色。但是,对于权限,我认为这是一个更精细的控制,你会怎么做呢?让我详细说明一下 在我的asp.net mvc站点中,我有不同的领域,如管理、管理、消息传递、报告等。我会为每个领域设置角色,

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

我已决定扩展默认提供程序,并实现我自己的成员资格和角色提供程序。现在我的问题是关于角色身份验证的

传统上,您可能会创建诸如“经理、管理员、员工、超级用户”或其他角色。但是,对于权限,我认为这是一个更精细的控制,你会怎么做呢?让我详细说明一下

在我的asp.net mvc站点中,我有不同的领域,如管理、管理、消息传递、报告等。我会为每个领域设置角色,如“管理员”、“经理”、“报告者”等。如果没有适当的角色,您将无法访问该站点的该领域。因此,我会在类级别锁定整个控制器

但现在以一个地区为例,;消息传递,并说我想对CRUD拥有更细粒度的权限;创建消息、查看/阅读消息、编辑消息、删除消息等

最后是我的问题。如何最好地实施这种更精细的控制?我看到的一种方法(不确定这是否是一种好方法)是为所有内容创建asp.net成员角色。所以我可能

Messenger(广泛级别角色)、CreateMessage、ReadMessage、EditMessage、DeleteMessage

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

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

迄今为止的解决方案

我决定创建自己的模式并实现自定义成员资格和角色提供程序。我的模式包括

  • 使用者
  • 用户配置文件
  • 许可
  • 许可转让
  • 角色
  • 角色分配

将离开一两天,但有机会时将更新更多信息。

以及在控制器上方添加
[Authorize(Roles=“Administrator”)]
等。您还可以将该属性放在个人操作上关于您的CRUD示例,您不是真的在谈论授权吗?授权是否会因成员角色“经理”和“报告者”而有所不同?我认为,如果角色不区分消息之间的读写授权,则需要为这些细粒度的活动创建单独的机制


如果您要为每个操作创建一个角色-EditMessage,DeleteMessage-如果经理a不能删除经理B的消息,您会怎么做?

我认为您应该忘记授权机制上的角色,而是请求权限(最后角色是权限的升级),因此,如果这样看,您的
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()
通过这种方式,您的角色可以做他们最擅长的事情,抽象权限集合,而不是确定不灵活的访问级别

编辑:要处理特定规则,如David Robbins指出的规则,不允许经理A删除经理B创建的邮件,假设他们都具有访问此控制器操作所需的权限,则授权人不负责检查此类规则,即使您尝试在Action Filter级别检查,这也是一件痛苦的事情,因此您可以做的是将授权验证扩展到ActionResult(注入一个保存验证结果的Action参数),并让ActionResult在所有参数就绪的情况下在那里做出逻辑决策


这是一个类似的问题,与这里指出的情况不完全相同,但这是使用操作参数扩展授权验证的一个很好的起点。

您好,David,谢谢您的输入。“如果角色不区分消息之间的读写授权,我认为您需要为这些细粒度的活动创建单独的机制。”这正是我想知道的。至于你的情况…不确定。不过这一点很好。我不认为这是个问题。我的主要想法是,更高级别的经理将拥有对网站某个区域的完全访问权,而他们可能会向其下属的员工提供部分访问权(只读?)。与一般角色相比,我没有看到过对权限的过多讨论。去年我在一个项目中遇到过相同的情况,在该项目中,我有代理经理和代理等角色,但授权规则规定,只有代理David Robbins才能查看David Robbins记录,而代理和管理者只能查看她的直接下属。我用SQL中的几个表解决了这个问题,这些表表示代理和代理管理器之间的关系及其各自的记录。“…单个控制器操作可以应用特定的角色。”是否可以更进一步,不仅说“允许此操作?”还说“允许此特定实体执行此操作?”例如,David Robbins指出,不允许经理A删除经理B创建的邮件的情况?该特定情况可以由操作处理,但授权的实际逻辑和操作结果会发生一些变化,之前的一个相关问题显示了如何将其存档,感谢Omar,我已经在这方面做了更多的工作,并将在获得更多关于我所处位置的信息后进行更新。干杯。我目前正在使用角色和权限,但我认为最终会转向您使用角色作为聚合的想法