我在 AAD 上遇到了一些奇怪的行为。用户成功登录后,我们会在 API 调用中收到针对某些用户的未授权。事实证明,JWT 中的声明丢失了。一些用户正在获取"groups"声明(他所属的所有groupId的数组(,而一些用户正在获取"hasgroups"声明(如果用户有组,则为布尔值,没有Id(。As our API app is checking this "groups" claim for authorization, the users who don't have this "groups" claim are getting a 403.
Nevertheless, in the manifest of the app registration I set the "groupMembershipClaims" from "null" to "All" or "SecurityGroup", which should do both the trick.同时将"oauth2AllowImplicitFlow"设置为 true,因为我们正在处理使用 OAuth2 的 Angular 应用程序。Next to that I've compared almost all users settings and apart from some extra groups the users are identical. The affected users don't have a lot of groups, some have even around the 5 groups at max.
我是否忽略了某些内容或导致索赔差异的原因?如何解决此问题,以便所有用户都获得"组"声明?
从 MSFT 内部获得以下反馈:
在隐式流中,oauth 将直接从 通过查询字符串参数进行初始/授权调用。http 规范 限制查询字符串/URL 的长度,因此如果 AAD 检测到 生成的 URI 将超过此长度,它们将替换组 与哈斯集团的主张。
而这个
这是使用隐式授权流时的设计使然,无论 清单中的"组成员身份声明"设置。这是为了避免去 超过浏览器的 URL 长度限制,因为令牌以 URI 片段。因此,或多或少在 4 个用户的组成员身份之后, 你会在令牌中得到"hasgroups:true"。你能做的是做一个 单独调用图形 API 以查询用户的组 会员。
因此,需要对图形 API 进行额外的往返,以便获取用户组。希望这也对其他人有所帮助。
这现在记录在 Azure AD 令牌引用中,https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-token-and-claims。
对于 OAuth2 隐式授权流,它使用hasGroups
令牌和此令牌的文档状态:
如果完整组声明会将 URI 片段扩展到 URL 长度限制之外(当前为 6 个或更多组(,则用于代替隐式授权流中 JWT 的
groups
声明。
对于其他流:
如果用户所在的组数超过限制(SAML 为 150,JWT 为 200(,则会添加超额声明,该声明源指向包含用户组列表的 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 中所述