只是为了补充@Lin 上面所说的内容。我具体指的是这个问题:
什么时候必须使用基于角色的安全性以及何时使用基于声明的安全性?
你能写几个例子吗?
我不得不在这个答案中添加更多信息,这是因为我没有明确解决基于声明和基于角色的身份验证模型之间的区别。根据经验和概念本身的性质以及 Microsoft Docs 上的介绍和记录,这两种授权模型经常一起使用,下面的示例 3 说明了它们何时经常一起使用的示例。现在让我们详细讨论一下主题:
基于声明的授权:
需要注意的重要一点是,与基于角色的授权相比,基于声明的授权本质上是受第三方约束的。声明是描述用户的第三方应用程序向您(您的应用程序)提供的信息。该信息可以是任何类型的数据。举个例子吧:
示例 1:
假设您有一个用于混合歌曲的软件应用程序。这个应用程序基本上使用来自 Spotify 或 YouTube 音乐平台等的歌曲,但它的构建方式是它可以完全访问这些平台的音乐库。但是这个应用程序不需要您使用您的 Spotify 或 google 帐户登录,您基本上只需使用电子邮件和密码进行注册。但在您在线后,要使用来自 Spotify 或 Youtube 音乐的音乐,您需要输入用于创建 sportify 或 YouTube 音乐帐户的电子邮件地址。然后应用程序(通过网络服务)从相应的第三方应用程序请求您的订阅帐号并将其存储为声明。因此,每次您在线时尝试访问音乐时,该应用程序都会使用已注册声明的政策来检查您是否有订阅帐户,然后允许访问。这样做的好处是,索赔与信息一起存储,例如您存储索赔来源的发行人。就是这样。您使用了由第三方提供的声明 subscriotionAccountNumber,该声明描述了您站在他们这边。显然,这不是开发此类应用程序的最佳模型,但作为示例已经足够了。您正在根据从另一个第三方应用程序声明的有关用户的一些信息来授权您的用户。
基于角色的授权:
这里的这个已经很清楚了。最简单的方法是,您仅根据用户的角色和角色向用户授予访问权限。
示例 2:
想象一个有来自不同职位的多个用户的组织应用。您可以根据用户的职位为其分配角色,并根据他们的角色授予对不同信息的访问权限。经理、所有者、员工……基本上,并非所有员工都可以访问经理和所有者可以访问的所有内容。这适用于经理和所有者。经理无权访问某些仅属于所有者的信息。就这么简单。
把它们放在一起:
在 ERP 系统等应用程序中,声明和角色一起使用以构建复杂的授权模型。我总是会说当前的身份框架是如此完整,以至于您通常不需要破坏现有模型的不必要的扩展,显然需求可能会有所不同,有时打破模型可能是唯一的选择。当角色和声明一起使用时,声明充当权限。这就是模型中有RoleClaim 和UserClaim 表的原因。那就是允许您将授权扩展到角色本身之外。当声明与角色一起使用时,它们仅提供执行某些操作的访问权限。
示例 3:
假设您有一个时钟系统,其中有一名技术人员和一名经理。在每周结束时,技术人员必须安排带有时钟信息的报告,显示该周工匠的工作时间,这些信息被合并并由工资单使用。此类系统通常必须在提交最终报告之前进行修改或更正,因为您不想多付或少付您的员工。您可以通过创建Manager Role 和Technician Role 为经理和技术员使用Role-Based 方法。但是Manager Role 是能够访问和编辑工匠时钟信息的。另一方面,您可以让Technician Role 没有这些能力来访问该信息。但这是有趣的部分;经理可以提出索赔并允许技术人员访问时钟系统并进行报告。因此,可以仅针对未经编辑的访问提出声明,或者可以在具有访问和编辑功能的情况下进行声明。请记住,只有您的应用程序才能理解您的声明的含义。它们可以命名为任何名称,GrantWriteAccess、GrantReadAccess 等,没有什么可以限制您。将声明预定义为权限后,您需要做的就是将该声明与用户相关联。在这种情况下,技术人员会将GrantWriteAccess 和 GrantReadAccess 添加到他们的UserClaim 表中。
这更像是说,默认情况下,作为经理,我可以访问一些我的技术人员无法访问的信息。但我并不总是在办公室附近?我该怎么做才能让他即使我不在身边也能做这项工作?为了解决这个问题,系统可以为管理人员创建声明(权限)的功能,无需访问某些特定信息。我们经常在我们的 ERP 系统中随处看到这些。无法访问某些模块的用户,当他们被提升时,他们被授予对 ERP 系统更多模块的权限,有时保持相同的用户角色,并且只有一些权限被打开。