声明、属性和角色之间有什么区别?

信息安全 验证 授权 rbac
2021-08-17 20:46:41

关于基于声明的身份验证以及与其他方法的区别已经提出了许多问题: 基于角色的与基于声明的 解释基于声明的身份验证 现在,我最喜欢的答案是在 stackoverflow 上给出的答案:使用基于声明的身份验证

但是,在阅读它们之后,我的问题并没有解决。我有两个问题:

  1. 声明和属性 (ABAC) 之间有区别吗?
  2. 如果我们可以将“角色”视为一种声明,那么基于声明的授权相对于基于角色的授权的特殊优势是什么?注意:我在这里使用授权而不是身份验证,因为我觉得这与身份验证无关)。

为了进一步阐述我的问题,我将给出三个示例来说明我如何看待基于声明、基于角色和基于属性的授权。免责声明:我不确定这些示例是否正确,它们只是我问题的一部分。

基于声明的示例

我已经阅读了一篇有趣的博文,其中解释了我们如何在 MVC / Web API 中使用基于声明的身份验证。似乎(在那篇博文中)通过查看与尝试访问该方法的用户相关联的声明来保护(授权)方法。如果该用户有权“查看”“街道地址”,则他有权查看该数据。

  [ClaimsAuthorize("Read", "SomeData")]
  public string Get()
  { 
      return “somedata”;
  }

现在,声明的创建被分离到其他地方,该博客文章中并未真正指定。我假设隐藏方法检查是否允许具有特定角色的用户查看街道地址。那么基于角色的授权有什么区别呢?

基于角色的示例

区别我不清楚,让我们与旧的基于角色的授权进行比较。我可以再次为每个方法定义一个属性,它将该方法的执行限制为某些角色。例如,“查看街道地址”方法仅限于具有“管理员”角色的用户。因此,我们不是在单独的方法中检查角色,而是在此处检查它。或者我在这里错过了什么?

  [RoleAuthorize('admin')]
  public string Get()
     { 
         return “somedata”;
     }

基于属性的示例

我确实看到了更细粒度的授权控制的优势。但是我会实现这样的东西,以定义只有具有管理员角色的用户才能在工作时间访问“某些数据”,并且只有该管理员用户有蓝眼睛。:

  [AttributeAuthorize('role=admin;time=09-17;eyecolor=blue')]
  public string Get()
     { 
         return “somedata”;
     }

最后一个示例对我来说似乎确实很有利,但我不确定它是否与我的第一个示例相同,即基于声明的授权。


最后,出现了最后一个问题:

  1. 这意味着声明与属性不同,因为属性用于定义用户拥有哪些权限,而声明是这些权限?
1个回答

属性是声明。声明只是某人/某物对用户具有给定属性的声明。某人是发行者,可能是 IdP 或从数据库获取数据的内部逻辑位。

这为您设计系统的方式提供了更大的灵活性,因为您可以指定给定任务将始终需要具有给定属性的用户,例如给定权限,例如“CanTransferMoney”。您可以创建什么角色来恰当地描述谁可以做到这一点?多久只有那个角色可以做到这一点?

在更高级别上,您可以将其配置为角色“资金经理”中的所有用户都具有属性“CanTransferMoney”,但这样做不需要您进行代码更改,而在代码中硬编码角色可能。

关于您的最后一个问题,从概念上讲,声明定义了您拥有的权利,而属性定义了您拥有的权利。在我看来,在某些时候,它实际上只是归结为您要使用哪个名称的语义。如果您查看 SAML 令牌最初是如何设计的,您会看到声明是/是断言中提供的属性的函数。