Azure AD OpenID 连接 - 组未显示在令牌中

Azure AD OpenID connection - groups not shown in token

我们想将我们的 Angular 前端应用程序连接到 Azure AD。我们开始使用以下示例项目对此进行测试:https://blogs.msdn.microsoft.com/premier_developer/2018/10/24/using-adal-js-with-angular4/#

在“app.module.ts”中,我们提供了如下所示的 Azure AD 配置。

{
  provide: APP_CONFIG, useValue: { 
    clientId: '<our-client-id>',
    tenantId: '<our-app-id>',
    redirectUri: 'http://localhost:4200/frameredirect',
  }
}

在 Azure 门户中,我们创建了应用程序注册并配置了重定向 url 以匹配上述内容。根据 https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens 中提到的信息,我们还应该在 Azure Portal 中配置应用程序清单,以便将用户组包含在令牌中。因此,在 Minifest 中,我们将 groupMembershipClaims 设置为 SecurityGroup。现在所有组织组都应该包含在令牌中。如果有很多角色,那么我们应该看到一个端点,我们可以在其中查询组。类似于:

"src1" : { "endpoint" : 
"https://graph.windows.net/{tenantID}/users/{userID}/getMemberObjects" }

设置完成后,登录成功。但是,用户组根本不包含在访问令牌中。有谁知道我们缺少什么?

正如您在评论中提到的,登录用户是 6 个以上组的成员。在这种情况下,您不会返回 groups 对所有组 ID 的声明,而是 Azure AD return 返回超额指示器,这是一个提示,让您知道用户是许多组的成员. Microsoft Docs

有团体声明

对于使用 OAuth 2.0 隐式授权流程的 SPA,使用的超额指标是 hasgroups 声明。这背后的原因是确保 URI 片段不超过 URL 长度限制。因此,如果用户是最多 5 个组的一部分,则长度不是问题,您会得到实际的组 ID。如果是 6 个或更多,则需要使用图 API 进行单独调用以获取组。

groups:src1 声明

groups:src1 声明也是一个超龄指示器,但是这个声明提供了更多关于调用哪个端点来获取组的信息。当 URL 与长度相关的限制不适用时,我看到了这种说法,例如例如,如果您使用的不是基于 Angular 的 SPA,而是基于 .NET 的控制台应用程序和 ADAL.NET 库。同样,目的是相同的,让您知道用户是许多组的一部分,您需要单独调用以获取该信息。

如何获取用户的组相关信息?

  1. 正如 hasgroups 声明本身提到的那样,您可以调用 Azure AD Graph API

    https://graph.windows.net/{tenantID}/users/{userID}/getMemberObjects
    
  2. 您也可以使用较新的 Microsoft Graph API。这是较新的推荐之一。您可以在此处阅读与 Azure AD Graph API 的比较以及何时使用哪一个 Microsoft Graph or Azure AD Graph

    我看到稳定版v1.0至少有两个API可能对你有帮助:

    List memberOf

    GET /users/{id | userPrincipalName}/memberOf
    

    user:getMemberGroups

    POST /users/{id | userPrincipalName}/getMemberGroups
    

    此 API 的检查是可传递的,这与读取 memberOf 导航 属性 不同,后者 return 仅用户是其直接成员的组。它支持 Office 365 和 Azure AD 中配置的其他类型的组。每个请求最多可以return组数为2046