【问题标题】:AAD groups claim missing in JWT token for some usersAAD 组声称某些用户的 JWT 令牌中缺失
【发布时间】:2023-03-31 19:42:01
【问题描述】:

我在 AAD 上遇到了一些奇怪的行为。在用户成功登录后,我们的 API 调用中的某些用户会收到未经授权的请求。事实证明,JWT 中的声明丢失了。一些用户正在获得“组”声明(他所属的所有 groupId 的数组),而有些用户正在获得“hasgroups”声明(如果用户有组,则为布尔值,没有 ID)。由于我们的 API 应用正在检查此“组”声明以获得授权,因此没有此“组”声明的用户会收到 403。

尽管如此,在应用注册的清单中,我将“groupMembershipClaims”从“null”设置为“All”或“SecurityGroup”,这应该可以解决问题。还要将“oauth2AllowImplicitFlow”设置为 true,因为我们正在使用使用 OAuth2 的 Angular 应用程序。接下来我比较了几乎所有的用户设置,除了一些额外的组之外,用户是相同的。受影响的用户没有很多组,有些甚至最多有 5 个组。

我是否忽略了某些内容或导致声明差异的原因?我该如何解决这个问题,以便所有用户都获得“群组”声明?

【问题讨论】:

    标签: oauth-2.0 jwt azure-active-directory azure-ad-b2b


    【解决方案1】:

    这在 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims 的 Azure AD 令牌参考中记录。

    对于 OAuth2 隐式授权流程,它使用 hasGroups 令牌和此令牌的文档状态:

    如果完整组声明将 URI 片段扩展超出 URL 长度限制(当前为 6 个或更多组),则用于代替隐式授权流中 JWT 的 groups 声明。

    对于其他流程:

    如果用户所在的组数超过限制(SAML 为 150,JWT 为 200),则将添加一个超额声明,声明源指向包含用户组列表的 Graph 端点。

    您可以使用 Graph API 通过https://graph.windows.net/{tenantID}/users/{userID}/getMemberObjects 获取用户组。

    或者在https://graph.windows.net/myorganization/isMemberOf?api-version 有端点,如https://msdn.microsoft.com/library/azure/ad/graph/api/functions-and-actions#isMemberOf 中所述

    【讨论】:

      【解决方案2】:

      从 MSFT 内部获得此反馈:

      在隐式流程中,oauth 将直接从 通过查询字符串参数进行初始/授权调用。 http规范 限制查询字符串/url 的长度,因此如果 AAD 检测到 结果 URI 将超过此长度,它们将替换组 使用 hasGroups 声明。

      还有这个

      这是在使用隐式授权流时设计的,无论 清单中的“groupMembershipClaims”设置。是为了避免走 超过浏览器的 URL 长度限制,因为令牌以 URI 片段。因此,或多或少在 4 个用户组成员身份之后, 您将在令牌中获得“hasgroups:true”。你可以做的是做一个 单独调用 Graph API 以查询用户组 会员资格。

      因此需要额外往返于 Graph API 以获取用户组。希望这对其他人也有帮助。

      【讨论】:

      • 感谢您的回答。经过数小时的工作和多次尝试,这对我很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2017-04-17
      • 2021-12-08
      • 2021-04-21
      • 2020-06-01
      • 2018-07-30
      相关资源
      最近更新 更多