-->

基于角色的访问控制(RBAC)与基于声明的访问控制(CBAC)在ASP.NET MVC基于角色的访问

2019-05-12 17:14发布

什么是使用的主要好处CBAC与RBAC ? 当是它更好地使用CBAC,当是它更好地使用RBAC?

我想了解CBAC模型的一般概念,但总的想法是仍不清楚我。

Answer 1:

我会尽量告诉你如何可以在ASP.NET MVC上下文声明基于访问控制中受益。

当您使用基于角色的身份验证,如果你有客户创造一个行动,你想的是谁在“出售”的作用人们应该能够做到这一点,那么你就写这样的代码:

[Authorize(Roles="Sale")]
public ActionResult CreateCustomer()
{
    return View();
}

后来,你意识到这一点,有时,从“营销”的作用人们应该能够创造客户。 然后,您更新这样的动作方法

[Authorize(Roles = "Sale", "Marketing")]
public ActionResult CreateCustomer()
{
    return View();
}

现在,你意识到这一点,一些营销人必须不能创造客户,但它不是可以分配为这些人谁是市场营销不同的作用。 所以,你不得不让所有的营销人创造顾客。

你发现另一个问题,任何时候你决定营销人应该被允许创建客户,你需要更新你所有的MVC Action方法授权属性,编译应用程序,测试和部署。 几天后,你决定,而不是营销而是一些其他的角色应该被允许做任务,让你在你的代码库搜索和删除授权属性的所有“营销”和授权的属性添加新角色的名字...这不是个健康解决方案。 在这一点上,你会意识到需要基于角色的访问控制权限。

基于许可的访问控制是分配不同的权限,不同的用户,并检查用户是否有权限执行从运行时代码中的行动方式。 后分配不同的权限给各种用户,你意识到你需要让一些用户执行一些代码,如果用户有像“Facebook的用户”,“老用户”的一些财产等。让我举一个例子。 假设你要允许访问特定页面,如果用户在使用登录Facebook。 现在,你将为该用户创建一个权限的Facebook“? 不,“Facebook的”不听起来像一个权限。 可以 ? 相反,它听起来像一个要求。 与此同时,权限听起来就像索赔过! 因此,最好是检查索赔,并允许访问。

现在,让我们回到根据要求访问控制的具体例子。

你可以定义一些设置这样的说法:

“CanCreateCustomer”, “CanDeleteCustomer”, “CanEditCustomer”。等等。

现在,你可以装饰你的操作方法是这样的:

        [ClaimAuthorize(Permission="CanCreateCustomer")]
        public ActionResult CreateCustomer()
        {
            return View();
        }

(请注意,[ClaimAuthorize(权限=“CanCreateCustomer”)可能不被内置到MVC类库,我只是表示作为一个例子,可以使用具有这种属性的类定义一些类库)

现在,你可以看到,CreateCustomer操作方法将总是需要许可“CanCreateCustomer”,它永远不会改变或很难改变。 所以,在你的数据库,创建权限(债权)和用户权限关系的表。 从你的管理面板,您可以设置谁可以做什么每个用户的权限(要求)。 您可以指定“CanCreateCustomer的许可(要求),以你喜欢的任何人,只允许用户将能够为客户创造并允许用户将能够创建唯一的客户,并没有别的(除非你指定其他权限相同的用户)。

此安全模式为您提供干净的代码的做法。 此外,当你写你的行动方法,你不必考虑谁可以使用此方法,而你总是可以放心,不管是谁使用这种方法将不得不管理给予适当的权限(要求)。 然后,管理员可以决定谁可以做什么。 不是你作为一个开发人员。 那是怎样的商业逻辑是从安全逻辑分离。

每当有人迹象,您的应用程序会检查任何权限可供用户和权限(要求)集将作为登录用户的当前附加属性(通常要求设置存储为cookie中登录的用户),所以你不必检查权限设置都是从​​数据库的时间。 底线是,你会得到你的安全逻辑的更多的控制权在你的应用程序,如果你申请基于要求访问,而不是基于角色的访问。 事实上,一个角色可以被视为一个索赔了。

如果您的应用程序是一个很小的应用程序,其中将只有两个角色:客户和管理,有没有机会,客户将能够做任何事情比他们是为了在你的应用程序做其他的话,或许,基于角色的访问控制的服务宗旨,但是随着应用的增长,你会开始觉得在某些时候根据要求访问控制的需要。



Answer 2:

我不完全埃姆兰的答案达成一致

[Authorize(Roles="Sale")]

天真

现在的问题是如何

  [Authorize(Roles="CustomerCreator")]

不同于

 [ClaimAuthorize(Permission="CanCreateCustomer")]

如果两者都一样好,我们为什么需要要求?

我想是因为

相比于角色索赔的概念是比较通用的

在上面的例子中,我们可以说“CustomerCreator”的上下文的类型的“角色”在权利要求的“Asp.NETroleProvider”提供

权利要求中的另外的例子。

  1. “AAA”的类型是“MYExamSite.Score”的权利要求的“MYExamSite.com”提供

  2. “金”的类型是“MYGYM.Membershiptype”的权利要求的“MYGYMApp”提供



Answer 3:

接受的答案似乎角色定位为钝器和权利要求一个灵活的工具,但在其他方面让它们看起来几乎相同。 不幸的是,这个定位做了损害索赔的概念,可能从根本上反映了它们的目的稍有分歧。

角色存在,只有一个隐含的范围内才有意义。 通常是一个应用程序或组织范围(即角色=管理员)。 权利要求中,在另一方面,可通过任何人造'。 例如,谷歌认证可产生权利要求包括用户的“电子邮件”,从而该电子邮件附连到的标识。 谷歌使得要求,应用程序选择是否理解和接受这种说法。 该应用程序本身可能随后附上了一个名为“使用authenticationMethod”(如ASP.NET MVC核心身份一样)使用“谷歌”的价值诉求。 每个权利要求包括一个范围,使得有可能识别一个如权利要求是否已经外部意,本地,或二者(根据需要或更细粒度。)

其要点是,所有的权利要求被明确附着的身份,其中包括一个明确的范围。 那些权利要求当然也可以用于授权 - 和ASP.NET MVC提供了用于经由授权属性的支持,但不是索赔的唯一或一定甚至主要目的。 这当然不从的角色,它可以在完全相同的局部范围的授权相同的方式使用区分开来。

因此,人们可以选择使用的角色,或索赔,或两者授权的目的,并有可能发现没有固有的优势或劣势要么,只要这些角色和权利要求中局部范围。 但是,如果,例如,授权取决于外部身份声明,那么角色将是不够的。 你将不得不接受外部的要求,并把它翻译成一个局部范围的作用。 不一定有什么不对的,但它引入了一个间接和遗弃语境层。



Answer 4:

我已经实现安全模型现在很多时候,不得不换我的头周围这些概念也是如此。 已经做了很多次,这是我对这些概念的理解。

什么是角色

角色=用户和权限的结合

一方面,一个角色是权限的集合。 我喜欢把它称为一个权限配置文件。 当定义一个角色,你基本上添加了一堆权限的扮演这种角色,所以在这个意义上的角色是一个权限配置文件。

在另一方面,角色也是用户的集合。 如果我添加Alice和Bob的作用“经理”,然后“经理”现在包含两个用户有点像一个组的集合。

事实是,一个角色既是用户的集合和权限的集合放在一起。 视觉上这可以被看作是一个文氏图。

什么是组

组=用户的收藏

“组”是严格的用户的集合。 组和角色之间的区别是,一个角色也有权限的集合,但一组只有用户的集合。

什么是许可

权限=什么题目可以做

什么是权限集

权限的权限集= A系列

在强大的RBAC系统,权限也可以像用户分组。 而组是用户的集合而已,权限集只是权限的集合。 这允许管理员在同一时间权限全集合到角色。

如何用户,组,角色和权限一起来吧

在强大的RBAC系统,用户可以添加到一个角色单独创建的角色或用户组的集合可以被添加到一个角色给用户的集合在同一时间添加到该角色。 无论哪种方式,作用得到了用户的集合被单独添加或添加组到角色或通过添加用户和组的组合,以角色。 权限可以以同样的方式被认为。

权限可以被添加到角色单独创建角色或权限集内权限的集合可以被添加到一个角色。 最后,权限和权限集的组合可以被添加到一个角色。 无论哪种方式,角色被单独添加或添加权限集角色获得其权限的集合。

角色的整个目的是结婚的用户权限。 因此,角色是用户和权限的联合。

什么是索赔

要求=什么是主题“是”

权利要求不权限。 正如在以前的答案中指出,索赔是什么主题“就是”不是一个主题“我能行”。

声明不更换角色或权限,它们是一个可以用来进行授权决策信息的附加件。

何时使用索赔

我已经发现当权利要求授权决定需要时用户不能被添加到一个或角色的决定不是基于用户的关联的权限被制成是有益的。 一个网站用户的示例将导致此。 Facebook的用户可能不是谁的人加入到“角色” ......他们只是一些游客通过Facebook认证。 虽然它并不完全适合RBAC这是一条信息,使一个授权决定。

@CodingSoft使用的夜总会比喻在前面的回答,我想延长它。 在该答案,驾驶执照被用作含有一组权利要求,其中出生日期表示的权利要求的权利要求DATEOFBIRTH的值中的一个被用来测试对授权规则的例子。 颁发驾驶执照的政府是给索赔真实性的权威。 因此,在夜总会的场景,在门口的保镖着眼于人的驾驶执照,确保它是由信任的机构(即必须是有效的政府颁发的身份证)出具的检验它是否是一个假身份证,然后看着出生(在驾驶执照的很多说法之一)的日期,然后使用该值来确定该人是老得足以进入俱乐部。 如果是这样,人通过借助于具有一个有效的权利要求,而不是由在某些角色被的授权规则。

现在,记住,基地,我想现在进一步扩展。 假设建筑物的夜总会是包含办公室,房间,厨房,其他楼层,电梯,地下室等,其中仅俱乐部的员工可以进入。 此外,某些员工可能会获得某些地方,其他员工不得。 例如,管理器可能具有高于其他员工进入办公室地板不能访问。 在这种情况下,有两个角色。 管理人员和员工。

虽然游客向公众夜总会区的访问是通过单一的要求授权如上所述,员工需要通过角色访问等非公有制限制房间。 对于他们来说,驾照是不够的。 他们需要的是员工标签,他们扫描进入门。 冥冥之中有授予的经理角色进入顶楼徽章,和徽章employee角色访问其他房间的RBAC系统。

如果因任何原因某些房间需要添加/通过角色中删除,这可以使用RBAC来完成,但它是不适合的索赔。

在软件权限

编码角色到应用程序是一个坏主意。 这种硬编码的角色到应用程序的目的。 哪些应用程序应该刚刚是像功能标志权限。 当功能标志是由通过配置访问,权限是由由被许可的DISTINCT集合来源于用户已经摆在所有角色收集到的用户安全上下文访问。这就是我所说的“有效权限。” 该应用程序应该只提出可能的权限功能/操作的菜单 。 该系统RBAC应该做的,通过角色结婚这些权限给用户的工作。 这样一来,有角色没有硬编码,当它被移除或一个新添加了权限更改的唯一时间。 一旦你已被添加到软件中应该永远不会改变。 在必要时(即当一个功能在新版本停产),只可以添加新的只应删除。

最后要注意的。

格兰特VS拒绝

一个强大的RBAC系统,甚至CBAC系统应该赠款和拒绝之间区分。

添加权限角色应该配备了一个GRANT或DENY。 当权限检查,所有授予的权限应加入有效权限的用户列表。 然后,所有完成后,拒绝的权限列表应使系统从有效权限列表中删除这些权限。

这使得管理员可以“调整”对象的最终权限。 这是最好的,如果权限也可以直接添加到用户。 通过这种方式,可以将用户添加到管理者角色,他们可以访问的一切,但也许你想拒绝访问夫人的厕所,因为用户是男性。 所以,你的男性用户添加到Manager角色和权限添加到用户对象与DENY所以它带走只是夫人的房间访问。

事实上,这将是一个要求一个很好的候选人。 如果用户有索赔“性别=男”,然后在Manager角色是可以访问的所有房间,但夫人的洗手间也要求索赔性别=女性和男性的厕所需要索赔性别=男性。 在这样一个不会有配置拒绝权限男性用户,因为索赔执法需要照顾的是给大家一个单一的授权规则。 然而,它可以做两种方式。

问题的关键是,与权限拒绝它使角色的管理更容易,因为异常可以实现。

下面是一个图我很久以前取得,显示了RBAC模型。 我没有权利要求的图形,但你能想象他们只是属性附加到随时随地的用户。 此外,图中未显示组(我需要在某个时候更新)。

我希望这有帮助。

这是上述RBAC的示意图

于2019年4月7,更新意见的基础上,从@Brent(谢谢)......除去以前的答案不必要的引用,也无需解释的@CodingSoft才能提供的“夜总会”的比喻在原有的基础,使这个答案无可厚非阅读其他的答案。



Answer 5:

更广泛地说,你应该考虑基于属性的访问控制(ABAC)。 RBAC与ABAC是由NIST,国家标准与技术研究所的国家定义的两个概念。 CBAC,而另一方面,是由微软推动的模式,这是非常相似的ABAC。

在这里阅读更多:

  • 基于角色的访问控制NIST页
  • 基于属性的访问控制NIST页


Answer 6:

RBAC和CBAC的根本在于:

RBAC:用户必须分配给一个角色被授权执行的操作。

CBAC:用户必须具有正确的价值要求,由应用程序如预期,被授权。 基于声明的访问控制是优雅的编写和维护更方便。

在那旁边声明由由应用程序信任的发行授权服务(安全服务令牌STS)向应用程序发出(依赖方)



Answer 7:

作用仅仅是一种类型的权利要求的。 这样,可以有很多其他的权利要求的类型,例如用户名是根据权利要求类型的一个



Answer 8:

这首先要分析决定哪种方法最前需要什么认证是非常重要的。 从下面的Microsoft文档,它说:“一位自称是不是什么题目可以做,例如,你可能有一个驾驶执照,由当地驾驶执照机构颁发的。你的驾照有你的出生日期。在这种情况下,索赔名是出生日期,索赔值将是你的出生日期,例如8 1970年6月与发行人将驾驶执照的权力。基于声明的授权,在其最简单的,检查索赔的价值,并允许访问。基于该值的资源,如果你想获得一个夜总会例如授权过程可能是:6" 门安全官员将评估你的出生要求(驾驶证机关,以及他们是否相信发行日期值)授予您访问之前。

从这个例子我们可以看出,访问与基于声明的授权一个亲近俱乐部退出从将由谁在夜总会的工作人员被要求授权的类型不同,在这种情况下,夜总会的工作人员会要求这是不需要的夜总会旅客为夜总会访客基于角色的授权都具有在夜总会在这种情况下一个共同的目的,因此基于声明的授权是适合夜总会访问者。

基于角色的授权https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles 2016年10月14日当创建一个身份,可能属于一个或多个角色。 例如,麦蒂可能属于同时斯科特管理员和用户角色可能仅属于用户角色。 如何创建和管理这些角色取决于授权过程的后备存储。 角色被暴露于通过上ClaimsPrincipal类IsInRole方法的显影剂。

基于声明的授权https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims二零一六年十月十四日当创建一个身份它可以被分配将由获信任方颁发的一个或多个权利要求。 一位自称是名值对代表的主题是什么,不是什么题目可以做。 例如,你可能有一个驾驶执照,由当地驾驶执照机构颁发的。 你的驾驶执照有你的出生日期。 在这种情况下,要求名称将是出生日期,索赔值将是你的出生日期,例如8 1970年6月与发行人将驾驶执照的权力。 基于声明的授权,在其最简单的,检查一个权利要求的值并允许访问基于该值的资源。 例如,如果你想获得一个夜总会授权过程可能是:

门安全官员将评估你的出生要求的日期的价值,以及他们是否给予信任之前,发行人(驾驶证机关)访问。

身份可以包含具有多个值的多个权利要求,并且可以包含相同类型的多个权利要求中。



Answer 9:

它也可以管理一个声明的方式作用。

相反,创建一个反映业务角色授权的角色,创建反映动作的角色,如CreateCustomer,EditCustomer,DeleteCustomer角色。 根据需要注释的方法。

这不是一个简单的事情个人映射到一组动作的角色,尤其是在角色列表变得更大。 因此,你需要在粒度的较低水平(如销售,市场)来管理企业的角色和地图业务中的角色所要求的动作角色。 即,将用户添加到业务角色,并把它们映射到现有的授权表所需要的(动作)角色。

你甚至可以覆盖业务中的角色和个人直接添加到行动的作用。

因为你建立在那些已经工作上面,你不撤消现有的授权过程。 你只需要几个表来实现此方法



Answer 10:

我认为这个问题可以从数据库中前瞻性地回答。 如果你注意到参与这一植入如何表,你会发现下面的

  1. AspNetUsers:每个用户都有一个排,全部由像电子邮件,地址电话,密码,所有用户所需的属性.....
  2. AspNetRoles; 不同的角色定义为每像GM,CTO,HRM,ADMIN,EMP应用需求。 什么每个角色定义是按照应用需求。
  3. AspNetUserRoles:每行链接AspNetUsers和AspNetRoles和一个用户和众多角色之间的有效联系。
  4. AspNetUserClaims:每行有关键AspNetUsers和一个类型和值。 这样有效地增加一个该属性可以添加每个用户/在运行时除去。

此表的使用可以在用户/应用程序的生命一个时刻进行调整,以满足特定的需求。

考虑“采购经理”(PM)的早期阶段,我们可以有三个技术途径

  1. 应用填充AspNetUserRoles一个行赠款“PM”买权。 要发出任何金额购买顺序,用户只需要“PM”的角色。

  2. 应用填充AspNetUserRoles与一个行到补助“PM”购买的权利,并填充AspNetUserClaims TYPE的“购买金额”型和“<1000”值来设置量限制在权利要求。 要发出采购订单,用户需要有“PM'and订单金额低于要求的TYPE要求值的购买金额“。

  3. 应用填充AspNetUserClaims与类型为“购买金额”型和“<1000”值,如权利要求。 任何用户都可以给出小于要求键入此用户的购买金额“的要求值量发出采购订单。

因为它可能会注意到,基于角色的粗粒度的,将简化但从系统管理点应用程序用户的生活刚性权利。 但是它会限制从视业务需求点用户的能力。 在基于另一方面要求是,需要分配给每个用户很细的权利。 基于将推动业务过于限制要求,但会使系统的管理非常复杂。



文章来源: Role-based access control (RBAC) vs. Claims-based access control (CBAC) in ASP.NET MVC