关于设置 asp.net 成员资格、角色提供者等有很多问题(和信息)。不管你是应该使用微软提供的内置平台,还是角色扩展你自己的基类和角色。
我决定扩展默认提供者并实现我自己的成员资格和角色提供者。现在我的问题是专门针对角色身份验证的。
传统上,您会创建角色,例如“经理、管理员、员工、 super 用户”或任何您拥有的角色。但是对于我认为是更精细控制的权限,您会/应该做什么?让我详细说明....
在我的 asp.net mvc 站点中,我有不同的区域,如管理、管理、消息传递、报告等。我会为每个角色创建角色,如“管理员”、“经理”、“报告者”等。没有适当的角色,你可以'无法访问该站点的该区域。所以我会在类里面用这个来锁定整个 Controller 。
但现在以一个地区为例;消息传递,并说我想为 CRUD 获得更细粒度的权限;创建消息、查看/阅读消息、编辑消息、删除消息等。
最后是我的问题。如何最好地实现这种更精细的控制?我看到的一种方法(不确定它是否好用)是为所有内容创建 asp.net 成员角色。所以我可能有....
Messenger(广义角色)、CreateMessage、ReadMessage、EditMessage、DeleteMessage。
一方面,我希望一些用户能够阅读/查看消息。但不一定创建或删除它们。单个 Controller 操作可以应用特定的角色。
你觉得这种方法有什么问题吗?你有更好的主意吗?
到目前为止的解决方案
我决定创建自己的模式并实现自定义成员资格和角色提供程序。我的架构包括;
接下来一两天会离开,但如果有机会,我会更新更多信息。
最佳答案
我认为你应该忘记授权机制上的角色,而是请求权限(最后,角色是权限的集合),所以如果你这样看,你的 Authorize
属性应该要求一个实体和 Action ,而不是一个特定的角色。就像是:
[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 创建的消息,假设他们都具有访问此 Controller Action 所需的权限,Authorize 不负责检查此类规则,即使您尝试在 Action Filter 级别检查它也会很痛苦,所以您可以做的是将 Authorize 验证扩展到 ActionResult(注入(inject)保存验证结果的操作参数),并让 ActionResult 做出逻辑决策那里有所有的论点。
This是一个类似的问题,并不完全是这里指出的情况,但它是使用操作参数扩展授权验证的一个很好的起点。
关于asp.net-mvc - 如何最好地处理 asp.net 成员中的权限(而不是角色),特别是在 ASP.NET MVC 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3298203/