5

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

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

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

4

2 回答 2

2

从 MSFT 内部得到这个反馈:

在隐式流程中,oauth 将通过查询字符串参数直接从初始 /authorize 调用返回 Jwt。http 规范限制了查询字符串/url 的长度,因此如果 AAD 检测到生成的 URI 将超过此长度,它们会将组替换为 hasGroups 声明。

和这个

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

因此需要对 Graph API 进行额外的往返才能获取用户组。希望这对其他人也有帮助。

于 2017-08-27T15:21:44.473 回答
0

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

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

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

对于其他流:

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

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

或者,在https://msdn.microsoft.com/library/azure/ad/graph/api/functions-and-actions#isMemberOfhttps://graph.windows.net/myorganization/isMemberOf?api-version中记录了端点

于 2018-07-27T04:04:38.240 回答