非RBAC用户角色和权限系统:具有属性的角色

时间:2010-05-15 10:53:08

标签: asp.net asp.net-membership rbac

我们目前在我们的网络应用程序(ASP.NET)中设计 用户角色和权限系统,似乎我们有几个案例 不适合在经典基于角色的访问控制(RBAC)中。我将发表几个问题,每个问题专门针对特定案例。这是我的第二个问题(第一个问题在这里:Non RBAC User Roles and Permissions System: checking the user's City)。

我们有以下情况:我们需要在我们的网络应用程序中实施经理角色。但是,管理员可以属于一个或多个公司(在我们正在创建此Web应用程序的一大群公司中)。比如,可以有“公司A和B的经理”,“公司C的经理”等。

根据管理公司所属的公司,他对某些操作访问:例如,他只能与他所属的公司的客户进行通信。也就是说,“公司A和B的经理”只能与公司A和B的客户联系,而不能与公司C的客户联系。他还可以查看公司A和B的客户详细信息页面,而不是C公司的客户详细信息页面等。

看来这个案子属于RBAC。但事实并非如此。我们需要创建一个 ManagerRole类,它将具有公司属性 - 也就是说,这不仅仅是作为权限集合的角色(就像在经典的RBAC中一样) ),但具有属性的角色

这只是具有属性的角色的一个示例。还有其他人:例如,管理员角色,它也属于许多公司,并且还有其他自定义属性。

这意味着我们将使用层次结构或角色类:


class Role – base class  
class ManagerRole : Role  
    List Companies  
class AdministratorRole : Role  
    List Companies  
    Other properties

我们调查了纯RBAC及其在多个系统中的实施,未找到具有层次结构或角色的系统,每个系统都具有自定义属性。在RBAC中,角色只是权限的集合。

我们可以使用带有属性的权限对我们的案例进行建模,例如ManagerPermission,AdministratorPermission,但这有很多缺点,主要是我们无法分配像“Manager”这样的角色公司A和B“直接向用户提供,但必须为公司A和B创建包含ManagerPermission的角色......此外,”经理“似乎是一个”角色“(在公司中的位置)而不是” “从语言学的角度来看”。

非常感谢有关此主题的任何想法,以及该领域的任何经验!

谢谢。

4 个答案:

答案 0 :(得分:1)

首先我要说的是,你的两个问题基本相同,应该合并。同一概念的多种变体没有任何价值。

您希望在基本角色中添加额外级别的任意歧视。

要实现这种RBAC并保留利用任何内置基础架构的能力,您需要做出一些妥协并构建一些自定义实现。

第一步是采用角色定义约定的妥协。例如当您想确定用户是否在'companyA'的角色'manager'时,您可以将规则(无论是属性,代码还是站点地图)定义为'manager-companyA',即IsUserInRole("manager-companyA")

第二步是自定义RoleProvider实现,它可以解析此问题并适当地查询维护层次关系的基础数据源,您必须为维护提供自定义UI。

您至少需要实现ASP.Net使用的方法,以确保以正确的格式检查或输出角色。

IsUserInRole将获得一个字符串,您将不得不使用约定解析为组成段以进行验证,如前所述。

在cookie中缓存角色时可以调用

GetRolesForUser,并且必须执行角色的层次递归并输出所有排列。例如用户是companyA和companyB的经理,因此GetRolesForUser("user")应返回由值manager-companyAmanager-companyB组成的数组,以供使用缓存角色且不以交互方式轮询的asp.net基础结构使用RoleProvider。

此类方法将为您提供已建立的ASP.Net RBAC设施的最广泛可用性,同时为您提供所需的自定义。

因此,总而言之,无论何时您可以调整您的期望和/或重新定义您的要求,以便尽可能使用现有基础架构,您必须实际设计,实施,测试和维护的代码越少(很少) ,您需要花费更多时间专注于尚未建立基础架构的系统的其他方面。

答案 1 :(得分:1)

我目前正在努力实现自己的RBAC库版本(出于理解RBAC内容的简单原因,一直专门针对我的代码库/数据库进行调整)。 (注意:约束是困难的部分)!!

我处理它(尚未完全实现)的方式是我创建了Groups,它们基本上是Users的集合。所以在这种情况下,我会创建三个组;公司A,公司B和公司C然后将每个用户适当地分配给这些组(公司)。

然后,您可以将Manager角色分配给特定用户,也可以为组分配角色。我喜欢这个,因为它允许我一次向多个用户添加一个卷(在数据库事务期间非常非常快,一旦缓存,内存占用空间就小得多)。

因此,在您的示例中,假设您有一个显示在UI中的Institution模型(或对象实例)。只需单击它然后选择它的“安全”菜单,就会出现一个窗口,允许您添加用户/组成员(如Windowns安全性)。通过添加(组)公司A并允许“读取”权限,您实质上允许该组中的所有用户读取对该公司及其子对象的访问权限,该对象将是客户联系人和数千个其他模型实例。

这可能并不完美,但它是迄今为止我找到的最佳解决方案(尽管我自己仍然有问题,我将就此问一个问题)。

答案 2 :(得分:0)

如果你的问题可以通过实现角色的继承来解决,你可以实现它。

您的示例是另一个采用基于属性的访问控制方式的机会(例如,允许具有管理员角色的用户并为公司A工作)。然而,实现RBAC系统要困难得多。

答案 3 :(得分:0)

我不确定这可能是您要查找的内容,但在我自己搜索RBAC系统的信息时,我想我可能找到了适合您需求的内容。我正在阅读Tony Marston的一篇文章,他谈到虚拟专用数据库/行级安全性。这些将在数据级别提供权限,这意味着您可以将用户限制为数据库中信息的某些子集。该文章的链接如下。

http://www.tonymarston.net/php-mysql/role-based-access-control.html(请参阅页面底部的“其他类型的访问控制”部分)

同样,我不确定这是你在寻找与否,但它可能值得快速浏览。