首页 > 解决方案 > 如何通过 Azure AD 检查用户是否在 AD 组中?

问题描述

设置规格

Startup.cs 配置

// COOKIES: Tells it to use cookies for authentication.
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    CookieManager = new SystemWebCookieManager()
});

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
    ClientId = ClientID,
    Authority = Authority,
    PostLogoutRedirectUri = PostLogoutRedirectUri,
    Notifications = new OpenIdConnectAuthenticationNotifications()
    {
        AuthenticationFailed = PrincipalService.OnAzureAuthenticationFailure,
        AuthorizationCodeReceived = (AuthorizationCodeReceivedNotification notification) =>
        {
            var username = notification.AuthenticationTicket.Identity.Name.Split('#').LastOrDefault();
            var emailAddress = notification.AuthenticationTicket.Identity.Claims.FirstOrDefault(x => x.Type.Contains("emailaddress"))?.Value;
            Logger.Log(Level.Auth, $"Azure login success! Username: '{username}' Email: '{emailAddress}'.");
            return Task.FromResult(0);
        }
    }
});

问题

鉴于此设置,我如何检查当前登录的用户是否在特定的 AD 组中?

我试过的

所有关于执行 Microsoft Graph API 的指南总是提出一个我不知道如何解决的问题(例如GetAccountsAsync返回空等)。

我在我们的应用注册清单中添加了以下内容:

"optionalClaims": {
    "idToken": [
        {
            "name": "email",
            "source": null,
            "essential": true,
            "additionalProperties": []
        },
        {
            "name": "groups",
            "source": null,
            "essential": true,
            "additionalProperties": []
        }
    ],
    "accessToken": [],
    "saml2Token": []
}

email工作正常,但显然groups不是,因为它是在黑暗中拍摄的。

标签: azure-active-directorymicrosoft-graph-api

解决方案


1. 将组成员声明作为 Token 的一部分

通过编辑应用程序的清单(这可以直接在 Azure 门户中完成)并将"groupMembershipClaims"属性设置为"All""SecurityGroup"根据需要,您可以启用组声明作为应用程序访问令牌的一部分。

2. 组 ID 作为声明的一部分返回

如上所述更新应用程序清单后,您可以获得组 ID 作为声明的一部分。这是解码的 JWT 令牌的快速示例

在此处输入图像描述

3.限制可以作为token一部分返回的组数

为确保令牌大小不超过 HTTP 标头大小限制,Azure AD 限制它包含在组声明中的 objectId 数量。如果用户是超过超额限制(SAML 令牌为 150,JWT 令牌为 200)的组的成员,则 Azure AD 不会在令牌中发出组声明。相反,它在令牌中包含一个超额声明,指示应用程序查询 Graph API 以检索用户的组成员资格。

4. 相关的 Microsoft Graph API

注意:使用 Microsoft Graph API 可能非常强大,因为您可以绕过超额情况,并在需要时获取有关组的所有其他类型的信息(如名称)。在这种特殊情况下,由于意图是验证组成员身份,组 ID 是最好的字段,因为它不会更改,而其他名称(如名称)可以。

检查成员组

如果您已经知道要检查/验证成员资格的组,这将很有帮助。

 POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/checkMemberGroups 

在请求正文中,您可以提供groupdIds,即包含要检查成员资格的组的对象 ID 的集合。最多可以指定 20 个组。

     {
      "groupIds": [
           "fee2c45b-915a-4a64b130f4eb9e75525e",
           "4fe90ae065a-478b9400e0a0e1cbd540"
       ]
     }

用户:getMemberGroups

如果您还不知道该组并且想要获取该用户所属的所有组,这将很有帮助。

POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/getMemberGroups

这是另一个相关的 SO 帖子


推荐阅读