【问题标题】:Non RBAC User Roles and Permissions System: a role with properties非 RBAC 用户角色和权限系统:具有属性的角色
【发布时间】:2011-02-19 20:31:25
【问题描述】:

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

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

根据经理所属的公司,他可以访问某些操作:例如,他只能与他所属公司的客户沟通。即“A、B公司经理”只能与A、B公司的客户联系,不能与C公司的客户联系。他还可以查看A、B公司的客户详情页面,不能查看C公司的客户详情页面等。 .

这个案子似乎属于 RBAC。然而,事实并非如此。我们需要创建一个 ManagerRole 类,它有一个 Companies 属性——也就是说,这不仅仅是一个作为权限集合的角色(就像在经典的 RBAC ),而是一个具有属性的角色

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

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


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

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

我们可以使用 具有属性的权限来模拟我们的案例,例如 ManagerPermission、AdministratorPermission,但这有很多缺点,主要是我们将无法分配像“Manager of公司 A 和 B”直接向用户发送,但必须为公司 A 和 B 创建一个包含 ManagerPermission 的角色……此外,“经理”似乎是一个“角色”(公司中的职位)而不是“许可”从语言的角度来看。

将不胜感激有关此主题的任何想法以及该领域的任何经验!

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    第一步是采用角色定义约定的折衷方案。例如当您想确定用户是否担任“公司A”的“经理”角色时,您可以将规则定义为“经理-公司A”,即IsUserInRole("manager-companyA")

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

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

    IsUserInRole 将获得一个字符串,您必须按照约定将其解析为组成部分以进行验证,如前所述。

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

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

    因此,总而言之,只要您可以调整您的期望和/或重新定义您的要求以尽可能多地使用现有基础架构,您必须实际设计、实施、测试和维护的代码更少(少得多) 并且您必须花更多的时间专注于系统的其他方面,而这些方面尚未建立完善的基础架构。

    【讨论】:

    • IsUserInRole("manager-companyA") 这样的代码一点也不漂亮。我们想要像 IsUserInRole("manager", CompaniesList) 这样的代码。此外,角色的此类属性的数量可能很大,并且像“manager-companyA,companyB...”这样的字符串可能会变得太长。我认为我们可以通过自己创建自己的权限和角色系统来做得更好,而不使用 ASP.NET 角色。我真的不认为这有什么问题。
    • @micha - 你可能误解了我写的一些内容。也许审查可能会清除它。在设计、实现、测试和维护了几个自定义提供程序堆栈之后,我对浪费的时间、金钱和睡眠感到遗憾,我只能祝你好运。
    • @code 诗人。我只能同意重新创造轮子的谬误。然而,有时轮子并不适合。一本好书是《专业的 ASP.NET 2.0 安全性、成员资格和角色管理》,它详细描述了每件事是如何运作的。
    • @ggonsalv。是的——如果它不合适,那么它就是不合适。但是,如果您可以操纵提供的基础设施或您的要求,那么最好不要负责编写、测试和维护该类型的代码。我推荐的参考资料,其中包含更痛苦的细节,是 Reflector 和 System.Web.Security、System.Web.Profile 和 System.CONfiguration 以及多年构建自定义提供程序堆栈。 ;-)
    • @codepoet- 我同意你的观点,要么使用基础设施,要么将问题压缩到基础设施中。现在不幸的是,我的编码经验主要是使用 .Net 1.1。然而,这里是新方法是否有意义的地方。提供者的扩展方法??重载 IsInrole 以获取角色和参数列表。对于安全性,总是令人困惑的是有两组数据可供比较。应用程序正在寻找的第一个角色以及用户拥有的角色。一个 lambda 表达式在这里有意义吗......只是对所有新东西感到困惑
    【解决方案2】:

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

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

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

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

    这可能并不完美,但它是迄今为止我找到的最好的解决方案(尽管我自己还有一些问题要问关于 SO 的问题)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        同样,我不确定这是否是您要查找的内容,但可能值得快速浏览。

        【讨论】:

          猜你喜欢
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          • 2020-10-18
          • 2016-02-16
          相关资源
          最近更新 更多