11

关于设置 asp.net 成员资格、角色提供者等有很多问题(和信息)。不管你是应该使用微软提供的内置平台,还是角色扩展你自己的基类和角色。

我决定扩展默认提供者并实现我自己的成员资格和角色提供者。现在我的问题是专门针对角色身份验证的。

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

在我的 asp.net mvc 站点中,我有不同的区域,如管理、管理、消息传递、报告等。我会为每个角色创建角色,如“管理员”、“经理”、“报告者”等。没有适当的角色,你可以'无法访问该站点的该区域。所以我会在课堂上用这个来锁定整个控制器。

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

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

Messenger(广义角色)、CreateMessage、ReadMessage、EditMessage、DeleteMessage。

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

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

到目前为止的解决方案

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

  • 用户
  • 用户资料
  • 允许
  • 权限分配
  • 角色
  • 角色分配

接下来一两天会离开,但如果有机会,我会更新更多信息。

4

3 回答 3

5

我认为你应该忘记授权机制上的角色,而是请求权限(最后,角色是权限的集合),所以如果你这样看,你的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()

这样,您的角色就可以做他们最擅长的事情,抽象权限集合,而不是确定一种不灵活的访问级别方式。

编辑:要处理大卫罗宾斯指出的特定规则,不允许经理 A 删除经理 B 创建的消息,假设他们都具有访问此控制器操作所需的权限,授权不负责检查此类规则,即使您尝试在 Action Filter 级别检查它也会很痛苦,所以您可以做的是将 Authorize 验证扩展到 ActionResult(注入一个保存验证结果的操作参数),并让 ActionResult 进行在所有论点都到位的情况下进行逻辑决策。

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

于 2010-07-21T16:04:03.263 回答
2

关于您的 CRUD 示例,您不是真的在谈论授权,并且授权在成员角色“经理”和“报告者”之间会有所不同吗?如果角色不区分消息之间的读取和写入授权,我认为您需要为那些更细粒度的活动创建单独的机制。

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

于 2010-07-21T10:39:26.060 回答
-1

以及[Authorize(Roles="Administrator")]在控制器上方添加等。您也可以将该属性放在个人操作

于 2010-07-21T10:28:49.063 回答