我在AAD上遇到了一些奇怪的行为。用户登录成功后,我们的API调用会对某些用户进行未经授权的操作。事实证明,JWT中的索赔缺失。有些用户正在获得“组”声明(他所属的所有groupIds的数组),有些用户正在获得“hasgroups”声明(如果用户有组,则没有ID,则为布尔值)。由于我们的API应用程序正在检查此“群组”授权声明,因此没有此“群组”声明的用户将获得403.
然而,在app注册的清单中,我将“groupMembershipClaims”从“null”设置为“All”或“SecurityGroup”,这应该同时做到这两点。当我们使用使用OAuth2的Angular应用程序时,还要将“oauth2AllowImplicitFlow”设置为true。接下来,我比较了几乎所有的用户设置,除了一些额外的组,用户是相同的。受影响的用户没有很多组,有些甚至在最多的5组中。
我是否忽视了某些内容或导致这种差异的原因?如何解决这个问题,以便所有用户都能获得“群组”声明?
答案 0 :(得分:1)
从MSFT内部获得此反馈:
在隐式流程中,oauth将直接返回Jwt 通过查询字符串参数进行初始/授权调用。 http规范 限制查询字符串/ url的长度,因此如果AAD检测到 结果URI将超过此长度,它们将替换组 与hasGroups声明。
这个
这是设计时使用隐式授权流程,无论如何 清单中的“groupMembershipClaims”设置。这是为了避免去 当令牌作为a返回时,超过浏览器的URL长度限制 URI片段。所以,或多或少在4个用户组成员之后, 你会在令牌中得到“hasgroups:true”。你能做的就是做一个 单独调用Graph API以查询用户的组 成员资格。
因此需要对Graph API进行额外的往返才能获得用户组。希望这也有助于其他人。
答案 1 :(得分:0)
现在已在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端点。 / p>
您可以使用Graph API通过https://graph.windows.net/{tenantID}/users/{userID}/getMemberObjects
获取用户组。
或者,https://msdn.microsoft.com/library/azure/ad/graph/api/functions-and-actions#isMemberOf处有https://graph.windows.net/myorganization/isMemberOf?api-version
处的端点