在设置ASP.NET成员资格,角色提供程序等时有很多问题(和信息)。您是否应该使用Microsoft提供的内置平台,或角色扩展基类和您自己的角色。

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

传统上,您可以创建角色,也可能像“经理,管理员,员工,超级用户”或您拥有的任何内容。但是你应该如何与我认为是更精细的控制粮食的权限?让我详细说明......

在我的ASP.NET MVC网站中,我有不同的领域,如管理,管理,消息,报告等。我会为这些像“管理员”,“经理”,“记者”等中的每一个都提供角色而在没有适当的角色,您无法访问该站点的该区域。所以我会在课堂级别锁定整个控制器。

但现在以一个区域为例;消息传递,并说我想拥有更精细的谷物权限;创建消息,查看/读取消息,编辑消息,删除消息等。

终于我的问题。如何最好地实施这种更精细的控制?我看到的一种方法(不确定它是一个很好的),是只需为一切创建ASP.NET隶属主义角色。所以我可能有......

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

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

你是否看到这种方法有任何问题?你有更好的主意吗?

解决方案到目前为止

我已经决定创建自己的架构并实现自定义成员资格和角色提供者。我的架构包括;

  • 用户
  • userprofile
  • 许可
  • permissionassignment
  • 角色
  • roleassignment

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

有帮助吗?

解决方案

我认为你应该忘记授权机制上的角色,请求权限(最后一个角色是权限的助剂),因此如果您这样看,您的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指点的特定规则,不允许Manager A删除Manager B创建的消息,假设它们都具有所需的访问此控制器操作权限,授权不责任检查此类规则,甚至您尝试在操作过滤器级别检查它将是一个痛苦,所以您可以做的是将授权验证扩展到ActionResult(注入持有的动作参数验证结果),让ActionResult在那里进行逻辑决策,所有参数都可以解决。

这个是一个类似的问题,没有完全指出这里的情况,但它是一个良好的起点,即将授权验证与动作参数扩展。

其他提示

关于你的CRUD示例,你不是真正谈论授权,并且授权会在“经理”和“记者”的成员角色之间变化?如果角色在消息之间的读写授权之间,我认为您需要为这些更精细的粗粒活动创建一个单独的机制。

如果您要为每个操作创建角色 - EditMessage,DeletEmessage - 在Manager A不应该能够删除Manager B的消息时,您会做什么?

以及添加控制器上方的[Authorize(Roles="Administrator")]等。您也可以将该属性放在唯一的动作上 too

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top