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

使用CBAC和RBAC的主要好处是什么? 什么时候使用CBAC更好?何时使用RBAC更好?

我试图理解CBAC模型的一般概念,但总体思路对我来说还不清楚。

我将尝试展示如何从ASP.NET MVC上下文中的基于声明的访问控制中受益。

在使用基于angular色的身份validation时,如果您有创build客户的操作,并且希望处于“销售”angular色的人员能够执行此操作,则可以这样编写代码:

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

后来,你意识到,有时,从“营销”angular色的人应该能够创build客户。 然后,你更新你的Action方法

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

现在,你意识到,一些营销人员不能创build客户,但是不可能为那些在营销中的人员分配不同的angular色。 所以,你不得不允许所有的营销人员创build客户。

您发现了另一个问题,无论何时您决定允许营销人员创build客户,您必须更新所有的MVC操作方法授权属性,编译您的应用程序,testing和部署。 几天后,你决定,不是营销,但应该允许其他angular色做任务,所以你在你的代码库中search并从Authorize属性中删除所有'Marketing',并在Authorize属性中添加你的新angular色名称。健康的scheme 在这一点上,你会意识到需要基于权限的访问控制。

基于权限的访问控制是向各种用户分配各种权限并检查用户是否有权在运行时从代码执行操作的一种方式。 在给各种用户分配不同的权限之后,如果用户拥有“Facebook用户”,“长时间用户”等属性,则需要允许一些用户执行一些代码。我们来举个例子。 假设你想允许访问特定页面,如果用户使用Facebooklogin。 现在,你会为该用户创build一个“Facebook”权限吗? 不,“Facebook”听起来不像是一个许可。 可以 ? 相反,这听起来像一个索赔。 同时,权限也可能听起来像索赔! 所以,最好是检查索赔,并允许访问。

现在让我们回到基于权限的访问控制的具体例子。

你可以像这样定义一些声明:

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

现在,你可以像这样装饰你的Action方法:

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

(请注意,[ClaimAuthorize(Permission =“CanCreateCustomer”)]可能没有内置到MVC类库中,我只是作为示例展示,您可以使用一些具有此类Attribute类定义的类库)

现在,您可以看到,CreateCustomer操作方法将始终需要“CanCreateCustomer”权限,并且永远不会更改或几乎不会更改。 因此,在您的数据库中,您将创build一个权限(声明)和用户权限关系表。 在pipe理面板中,您可以为每个可以执行操作的用户设置权限(声明)。 您可以将“CanCreateCustomer”权限(声明)分配给您喜欢的任何人,只允许用户创build客户,并且允许的用户将只能创build客户,而不会创build其他任何人(除非您为同一用户分配其他权限)。

这个安全模型为您提供干净的代码练习。 而且,当你编写Action Method的时候,你不必考虑谁可以使用这个方法,而是总是可以放心的是,使用这个方法的人会得到Admin给予的适当的许可(权利要求)。 然后,pipe理员可以决定谁可以做什么。 不是你作为开发者。 这就是你的业务逻辑如何从安全逻辑中分离出来的。

每当有人login时,您的应用程序将检查该用户可用的任何权限,并且该权限(声明)集将作为当前login用户的额外属性(通常声明集作为login用户的cookie存储)提供,所以你不必从数据库中检查权限设置。 底线是,如果您应用基于声明的访问而不是基于angular色的访问,则可以更好地控制应用程序中的安全逻辑。 事实上,一个angular色也可以被视为一个索赔。

如果您的应用程序是一个只有两个angular色的应用程序:客户和pipe理员,并且客户不可能做任何其他事情而不是在您的应用程序中执行其他任何操作,那么也许基于angular色访问控制将用于此目的,但随着应用程序的增长,您将开始感受到某种程度上基于声明的访问控制的需求。

我不完全同意Emran的回答

 [Authorize(Roles="Sale")] 

天真

问题是如何

  [Authorize(Roles="CustomerCreator")] 

不同于

  [ClaimAuthorize(Permission="CanCreateCustomer")] 

如果两者同样好,为什么我们需要索赔?

我想是因为

与angular色相比,索赔概念更为通用

在上面的例子中,我们可以说“CustomerCreator”是由“Asp.NETroleProvider”提供的“angular色”

索赔的其他例子。

  1. “AAA”是由“MYExamSite.com”提供的types“MYExamSite.Score”

  2. “黄金”是“MYGYMApp”提供的“MYGYM.Membershiptype”types的声明

接受的答案似乎将angular色定位为一个钝的对象,并声称作为一个灵活的工具,但否则使他们看起来几乎相同。 不幸的是,这种定位对索赔的概念不利,可能从根本上反映了对其目的的轻微误解。

angular色的存在只有在一个隐含的范围内才有意义。 一般来说,这是一个应用程序或组织范围(即angular色=pipe理员)。 另一方面,索赔可以由任何人“制造”。 例如,Google身份validation可能会产生包含用户“电子邮件”的声明,从而将该电子邮件附加到身份。 Google做出主张,应用程序select是否理解并接受这一说法。 应用程序本身可能会随后附加一个名为“authenticationmethod”的声明(如ASP.NET MVC Core Identity所做的),其值为“Google”。 每一项索赔都包括一个范围,以便可以确定索赔是否具有外部,本地或两者的意义(或根据需要更加细化)。

关键在于,所有权利要求都明确地附加在一个身份上,并包括一个明确的范围。 这些声明当然可以用于授权 – 而且ASP.NET MVC通过Authorize属性提供对此的支持,但这不是Claim的唯一或必然的主要目的。 它当然不会将它与angular色区分开来,angular色可以完全以相同的方式用于本地作用域授权。

因此,可以select使用angular色或权利要求或两者来进行授权,只要这些angular色和权利要求在本地范围内,就可能找不到任何固有的优势或劣势。 但是,如果授权取决于外部身份声明,则angular色将不足。 您将不得不接受外部声明并将其转换为本地范围的angular色。 当然,除了它引入了一个间接层之外,没有什么不对的。

RBAC和CBAC之间的基础是:

RBAC :必须将用户分配给angular色才能被授权执行操作。

CBAC :用户必须按照应用程序的预期拥有正确的值才能被授权。 基于声明的访问控制优雅,易于维护。

除此之外,由您的应用程序(依赖方)信任的颁发授权服务(安全服务令牌STS)向应用程序发出索赔,

更广泛地说,您应该考虑基于属性的访问控制(ABAC)。 RBAC和ABAC都是NIST(国家标准与技术研究院)定义的概念。 另一方面,CBAC则是微软推出的与ABAC非常相似的模式。

在这里阅读更多:

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

angular色只是一种types的索赔。 像这样,可以有许多其他的声明types,例如用户名称是声明types之一