ASP.NET角色身份验证 - 使用角色作为活动?

时间:2014-01-28 18:28:33

标签: c# asp.net authorization forms-authentication

我想比简单的基于角色的授权(管理员,用户,超级用户等)更进一步

而是执行基于活动的授权。

我的想法是为登录用户分配与他们是否可以执行操作相关的活动。

例如

CREATEUSER

ReadUser

UpdateUser两个

DeleteUser

我会创建与上述活动相关的页面

CreateUser.aspx

在每个页面上,我会检查经过身份验证的用户是否确实有权访问该活动。

我会通过使用角色来做到这一点。

例如

IsInRole( “CREATEUSER”)

在此之前,我可以在成功登录后将活动(角色)分配给经过身份验证的用户

我唯一真正关心的是,当我对用户进行身份验证并构建身份验证cookie时,它会为每个用户包含很多(可能)角色。

例如,我目前在我的系统中有60个活动(但随着我们添加更多功能,这可能会增加 - 每个功能都在进行新活动)

如果身份验证cookie必须携带大约60多个角色(活动)会导致任何已知问题吗?

有人可以提出另一种方法吗?

3 个答案:

答案 0 :(得分:1)

您可能需要查看IdentityModel framework。它具有用于构建自定义Authorize模块的基类,以根据Resource-Action模式验证权限。但这是为.NET 4.5构建的,不确定您的平台是什么。

.NET 4.5还包括用于Web身份验证的SessionAuthenticationModule(SAM)。 SAM可以在用户调用之间缓存角色,因此您不必在cookie中来回发送它们。 Here是关于其工作原理的更多信息。

答案 1 :(得分:0)

使用操作和权限,如Ayende's blog中所述。他有很多关于这个主题的文章。

http://ayende.com/blog/3109/rhino-security-overview-part-i

http://ayende.com/blog/tags/rhino-security

答案 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),您将能够在许多应用程序中重用它。