基于权限而不是基于角色

Permission Based instead of Role Based

在我的应用程序中,一个用户被分配了多个角色,一个角色被分配(授予)了多个权限。 所以在我的代码中,我从不检查角色,但总是检查细粒度的权限。

这里描述了为什么我认为基于权限的访问优于基于角色的访问: https://softwareengineering.stackexchange.com/a/299732

在 Azure AD 中,我可以为用户分配角色。 但是我看不到创建权限并将它们关联到角色的方法,所以我想这部分必须保留在我的应用程序中?

那我应该如何 link Azure 应用程序角色到我的应用程序的权限?

我的假设是我需要为此构建一个 UI,使用图形 API 检索 Azure 中为应用程序定义的角色列表。 如果是这样的话,那么与在我的应用程序中保留角色定义相比,使用 Azure 中的内置角色功能并没有太大好处...

我是不是漏掉了什么?

此时,Azure Active Directory 应用程序角色主要针对每个用户只能拥有一个角色且此角色映射到简单授权模型的场景。

虽然在技术上可以支持每个用户的多个角色,但这只能通过图表 API 进行管理,并且需要您为您的用户管理员/用户构建一个 UI 来管理.

如您所述,您的方案比这更复杂,每个用户有多个角色和多个(可能可自定义和重叠的)权限集。

鉴于这两点,您自己实现所有授权的方法是合理的。

查看这篇文章,其中更详细地概述了 Azure AD 最适合的授权场景:

https://azure.microsoft.com/en-us/documentation/articles/guidance-multitenant-identity-app-roles/

使用 Azure AD 声明的关键点是将用户信息保存在 Active Directory 而不是应用程序中。

在您的情况下,您需要创建映射到应用程序中的角色的权限。 然后可以将这些角色映射到 Azure AD AppRoles 或组。

我建议你不要直接将用户映射到角色。 如果您处理组,则不需要 add/remove 用户 to/from 应用程序:角色和权限是从用户所属的组继承的。

  1. 直接映射到组

    目前,这是我的首选方案。用户被分配到组,您的自定义角色被映射到这些组。 当你创建一个新用户时,你只需要将它添加到一些组中,你的应用程序不需要任何操作(删除用户时也是如此)。 如果您不怕预览(并且拥有 Azure AD Premium 许可证),Azure Ad 提供了一种方法 dynamically assign users to group.

暂时记住这一点 nested group memberships aren't currently supported。 因此,如果 A 组在 B 组中,并且 B 组在您的应用程序中具有某些权限,则 A 组的用户将不会继承 B 组的权限。

  1. 将组映射到应用程序角色

    此选项似乎有点矫枉过正,因为它还需要一个步骤:将 Azure 广告组映射到 Azure 应用程序角色并将这些角色映射到您的自定义角色。 您需要使用 AAD Graph API 实现所有这些逻辑,并且您的 UI 会更加复杂。

在你的场景中使用这个选项的唯一原因是你有一个包含大量组和应用程序的大目录:如果用户在超过 200 个组中,那么 Azure AD 返回的 Jwt 令牌将不包含组,您将不得不再次查询 Azure AD 以获取用户组 (see)。 在这种情况下,将组映射到应用程序角色可能很有意义,因为当用户对应用程序进行身份验证时,Azure Ad 将始终为您提供用户的角色(或用户所属组的角色)

您可以在这里找到有趣的代码示例: