AAD组声称某些用户在JWT令牌中丢失

时间:2017-08-18 08:24:16

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

我在AAD上遇到了一些奇怪的行为。用户登录成功后,我们的API调用会对某些用户进行未经授权的操作。事实证明,JWT中的索赔缺失。有些用户正在获得“组”声明(他所属的所有groupIds的数组),有些用户正在获得“hasgroups”声明(如果用户有组,则没有ID,则为布尔值)。由于我们的API应用程序正在检查此“群组”授权声明,因此没有此“群组”声明的用户将获得403.

然而,在app注册的清单中,我将“groupMembershipClaims”从“null”设置为“All”或“SecurityGroup”,这应该同时做到这两点。当我们使用使用OAuth2的Angular应用程序时,还要将“oauth2AllowImplicitFlow”设置为true。接下来,我比较了几乎所有的用户设置,除了一些额外的组,用户是相同的。受影响的用户没有很多组,有些甚至在最多的5组中。

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

2 个答案:

答案 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处的端点