关于基于声明的身份验证以及与其他方法的区别已经提出了许多问题: 基于角色的与基于声明的 解释基于声明的身份验证 现在,我最喜欢的答案是在 stackoverflow 上给出的答案:使用基于声明的身份验证。
但是,在阅读它们之后,我的问题并没有解决。我有两个问题:
- 声明和属性 (ABAC) 之间有区别吗?
- 如果我们可以将“角色”视为一种声明,那么基于声明的授权相对于基于角色的授权的特殊优势是什么?(注意:我在这里使用授权而不是身份验证,因为我觉得这与身份验证无关)。
为了进一步阐述我的问题,我将给出三个示例来说明我如何看待基于声明、基于角色和基于属性的授权。免责声明:我不确定这些示例是否正确,它们只是我问题的一部分。
基于声明的示例
我已经阅读了一篇有趣的博文,其中解释了我们如何在 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”;
}
最后一个示例对我来说似乎确实很有利,但我不确定它是否与我的第一个示例相同,即基于声明的授权。
最后,出现了最后一个问题:
- 这意味着声明与属性不同,因为属性用于定义用户拥有哪些权限,而声明是这些权限?