我想比简单的基于角色的授权(管理员,用户,超级用户等)更进一步
而是执行基于活动的授权。
我的想法是为登录用户分配与他们是否可以执行操作相关的活动。
例如
CREATEUSER
ReadUser
UpdateUser两个
DeleteUser
我会创建与上述活动相关的页面
即
CreateUser.aspx
在每个页面上,我会检查经过身份验证的用户是否确实有权访问该活动。
我会通过使用角色来做到这一点。
例如
IsInRole( “CREATEUSER”)
在此之前,我可以在成功登录后将活动(角色)分配给经过身份验证的用户
我唯一真正关心的是,当我对用户进行身份验证并构建身份验证cookie时,它会为每个用户包含很多(可能)角色。
例如,我目前在我的系统中有60个活动(但随着我们添加更多功能,这可能会增加 - 每个功能都在进行新活动)
如果身份验证cookie必须携带大约60多个角色(活动)会导致任何已知问题吗?
有人可以提出另一种方法吗?
答案 0 :(得分:1)
您可能需要查看IdentityModel framework。它具有用于构建自定义Authorize模块的基类,以根据Resource-Action模式验证权限。但这是为.NET 4.5构建的,不确定您的平台是什么。
.NET 4.5还包括用于Web身份验证的SessionAuthenticationModule(SAM)。 SAM可以在用户调用之间缓存角色,因此您不必在cookie中来回发送它们。 Here是关于其工作原理的更多信息。
答案 1 :(得分:0)
使用操作和权限,如Ayende's blog中所述。他有很多关于这个主题的文章。
答案 2 :(得分:0)
你想要的是一种能力列表方法。
解决方案是将角色映射到功能,类似于:
>Online Anon User Admin
Article ReadOnly ReadWrite ReadWrite
Article.List ReadOnly ReadOnly ReadOnly
Article.Edit Hidden ReadWrite ReadWrite
Article.Delete Hidden ReadOnly ReadWrite
Article.Title.Edit * * ReadWrite
在实践中,这些将是您的坐标:
>(system state)
系统可能是“在线,离线,维护”等等。
使用初始>
在文件中查找矩阵的开头(您将拥有其中的许多内容)。在C#中,您将拥有enum
。
同一行是角色:
Anon User Admin
然后在左侧,您将具有作用于命名空间和操作的功能:
<item>
<item>.<action>
<item>.<field>.<action>
<item>.<field>.<value>.<action>
单元格将包含以下值之一:
Hidden, ReadOnly, ReadWrite or *
*
将表示从父项或字段“继承”。
这样您就可以根据项目,操作,角色和当前系统状态微调权限。
将列表转换为内存中结构的简单解析器就可以了。不要把它放在DB上,这将是一种痛苦。将它保存在文本文件/内存级别更好。添加FileSystemWatcher
以在更改其他功能时读取该文件,并利用延迟加载。此外,将其存储在Application state
内存中,而不是存储在会话中。
请记住:默认将是Hidden
(甚至不读取访问权限,该角色完全无法访问该项/操作。
您真正关心的是您真正需要的角色(根据我的经验,角色几乎映射到UML演员,可能有一些轻微差异),以及项目/字段/值和操作的真正含义。当您编写项目时,您实际上可以指一组项目。无需将功能列表直接映射到数据库/实体或代码结构。功能列表是在更高的语言级别,它是语义并绑定到域,而不是代码(我想强调这一点,因为它是这种方法背后的真正力量)。
一旦用简单的解析器和辅助对象实现了这种方法(建议使用信息专家原则,避免使用Singletons),您将能够在许多应用程序中重用它。