【问题标题】:Emit role's permissions as claims in JWT with AAD (Azure AD)使用 AAD (Azure AD) 在 JWT 中将角色的权限作为声明发出
【发布时间】:2019-11-18 10:20:29
【问题描述】:

我需要在 JWT 中将角色的权限作为声明发出。

目的是在 JWT 中获取某个用户的权限作为声明用于授权目的。

用户所属的组与某个角色相关联,该角色在 Azure Active Directory 中具有某些权限。

澄清: 如果我在应用程序清单中的 appRoles 数组中添加一些项目,则角色名称将作为 JWT 中的角色类型声明以以下格式发出: http://schemas.microsoft.com/ws/2008/06/identity/claims/role: [appRole 项中的 value 属性出现在他的清单 appRoles 数组中]

但我找不到任何方法可以将角色的权限名称(或任何其他属性)作为声明发出。

几天来,我一直在谷歌搜索和挖掘 MS 文档,但找不到任何东西。我希望这是可能的。

如果不可能,一个笨拙的解决方法可能是将我们需要发出的权限表示为 AAD 角色,并将角色(在“一组权限”的含义中)表示为 AAD 特殊组,然后将我们希望与角色相关联的组(在理想世界中)关联到那个特殊的“角色”组。

但这很笨拙,因为我们实际上会失去角色(一组权限)的自然含义,以及组(一组用户和/或组)的自然含义

感谢您的帮助:)

【问题讨论】:

    标签: jwt azure-active-directory jwt-auth


    【解决方案1】:

    value 属性是您配置的自定义角色名称,将在 JWT 中返回。这是设计使然。

    权限名称不会在 JWT 中返回。将 appRole 添加到 Azure AD 应用后,需要assign users and groups to the role

    您需要在 Azure AD APP 中添加所需的权限,然后在您的代码中控制权限。

    我们假设你已在 Azure AD 应用程序中分配了一个自定义角色,并向该角色添加了一个用户。

    当用户登录时,将返回一个包含角色声明的令牌。您可以在代码中判断用户的角色。如果它与自定义的 appRole 匹配,则允许他执行操作。如果用户不匹配任何一个appRoles,他就没有执行任何操作的权限。

    【讨论】:

    • 感谢您的回答,但我已经完成了您所写的所有内容并且它正在工作。我在问题的标题及其正文中特别强调 - 有没有办法将与该自定义角色相关联的权限本身作为 jwt 中的声明发出,以便我可以做出真正的基于声明 -身份验证而不是基于角色的身份验证?
    • 如果你只是想知道一个用户有什么权限,你可以给每个角色分配一个权限。并将 value 属性设置为与权限名称相同。
    • 这正是我在问题中描述的笨拙的解决方法(有一点扩展),这使得角色失去了作为“权限集”的目的(就像一个组是一个“用户集和/或其他组”)。虽然可能会发出组 ObjectIds(为了不让 JWT 变得太大,限制了一定数量,在这种情况下,我们应该只调用 Graph API 来获取所有组) - 我没有看到任何方法将权限作为声明发出。调用 Graph API 是一次昂贵的往返,我当然会尽量避免,因为我不会问这个问题
    • 再次,我正在寻找基于声明的授权而不是基于角色的授权,就像身份服务器一样。如果我自己编写一个身份验证服务器,我将提供一个选项来发出用户的直接权限(例如,如果使用身份,则从 UserClaims 表中)以及与与所有组相关联的所有角色相关联的所有权限用户是(来自 RoleClaims 与用户角色和用户组角色联合)的成员,因此直接或间接获得用户拥有的所有权限
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2021-10-09
    • 2019-01-24
    • 2014-12-06
    • 2018-02-10
    • 2020-02-13
    • 2021-08-06
    相关资源
    最近更新 更多