我在 AAD 上遇到一些奇怪的行为。用户成功登录后,我们的 API 调用中某些用户收到未经授权的消息。结果发现 JWT 中的声明丢失了。一些用户获得“groups”声明(他所属的所有 groupId 的数组),一些用户获得“hasgroups”声明(如果用户有组,则为布尔值,没有 Id)。由于我们的 API 应用程序正在检查此“组”声明以获取授权,因此没有此“组”声明的用户将收到 403。
尽管如此,在应用程序注册的清单中,我将“groupMembershipClaims”从“null”设置为“All”或“SecurityGroup”,这应该可以解决这两个问题。还将“oauth2AllowImplicitFlow”设置为 true,因为我们正在使用使用 OAuth2 的 Angular 应用程序。接下来,我比较了几乎所有用户设置,除了一些额外的组之外,用户是相同的。受影响的用户没有很多组,有些甚至最多有 5 个组。
我是否忽略了某些事情或是什么导致了索赔的这种差异?我该如何解决这个问题,以便所有用户都获得“组”声明?
从 MSFT 内部得到了这样的反馈:
在隐式流程中,oauth 将直接从
通过查询字符串参数进行初始/授权调用。 http 规范
限制查询字符串/url的长度,因此如果AAD检测到
生成的 URI 将超过此长度,它们会替换组
与 hasGroups 声明。
And this
这是使用隐式授权流程时设计的,无论
清单中的“groupMembershipClaims”设置。是为了避免去
超过浏览器的 URL 长度限制,因为令牌作为返回
URI 片段。因此,或多或少在 4 个用户的组成员身份之后,
您将在令牌中得到“hasgroups:true”。你能做的就是做一个
单独调用Graph API来查询用户组
会员资格。
因此需要对 Graph API 进行额外的往返才能获取用户组。希望这也对其他人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)