繁体   English   中英

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

[英]ASP.NET Roles Authentication - Using Roles as Activities?

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

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

我的想法是将活动分配给已登录的用户,这与他们是否可以执行操作有关。

例如

创建用户

ReadUser

UpdateUser两个

DeleteUser

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

CreateUser.aspx

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

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

例如

IsInRole( “CREATEUSER”)

在此之前,我可以在成功登录后将活动(角色)分配给已认证的用户

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

例如,我当前在系统中有60个活动(但是随着我们添加更多功能,这个活动可能会增加-每个功能本身都有一个新活动)

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

有人可以建议替代方法吗?

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

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

您想要的是一种功能列表方法。

解决方案是将角色映射到功能,类似于:

>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 *

*表示从父项或字段“继承”。

这样,您将能够根据项目,操作,角色和当前系统状态来微调权限。

一个简单的解析器会将列表转换为内存结构。 不要将其放在数据库上,这会很痛苦。 将其保持在文本文件/内存级别更好。 添加FileSystemWatcher可以在更改该文件以获取其他功能时读取该文件,并利用延迟加载。 另外,将其存储在Application state存储器中,而不是在会话中。

请记住: 默认设置为“ Hidden (甚至没有读取访问权限,该角色将完全无法访问该项目/操作。

然后,您真正关心的是您真正需要哪个角色(以我的经验,一个角色几乎映射到UML参与者,也许会有一些细微的差异),以及项目/字段/值和动作的真正含义。 当您写一个项目时,您实际上可以指一组项目。 无需将功能列表直接映射到数据库/实体或代码结构。 功能列表处于较高的语言级别,它是语义的,并且绑定到域,而不是代码(我想强调这一点,因为这是此方法背后的真正力量)。

一旦使用简单的解析器和帮助器对象实现了这种方法(建议使用信息专家原则,避免使用Singletons),您将可以在许多应用程序中重用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM