【问题标题】:How to check if a user is in an AD group via Azure AD?如何通过 Azure AD 检查用户是否在 AD 组中?
【发布时间】:2019-06-04 01:35:53
【问题描述】:

设置规范

  • .NET 4.5.1 MVC 项目
  • 项目包含 .aspx 文件(旧版)
  • 目前使用 Azure AD 通过 Cookie 进行身份验证。
  • Azure 门户(通过应用注册)配置了“隐式授予 - ID 令牌”和“仅限此组织目录中的帐户”
  • 本地 AD 组被推送到 Azure 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 门户中完成)并将 "groupMembershipClaims" 属性设置为 @987654328 来启用组声明作为应用程序访问令牌的一部分@ 或 "SecurityGroup" 根据需要。请知道,当用户所属的组数量很多时..您可能不会将所有组作为令牌的一部分,而是一个超额指示符..您可能需要在此类中单独查询组案例
  • 好的,所以我将“groupMembershipClaims”设置为“All”,它正在返回 guid。有没有办法让它返回组的名称?
  • 查看这篇文章以获得更详细的解释以及从 Microsoft 图形的角度来看的一些其他选项。stackoverflow.com/questions/54149675/…
  • 不是 AFAIK .. 您只会返回组 ID 作为声明的一部分.. 而不是组名.. 如果您在组名之后,Microsoft Graph API 可能是您最好的选择(因为那将也可以帮助解决任何超龄情况)
  • 如果您要验证用户是否属于某个组,那么无论如何您都应该使用组 ID。名称可能随时更改。我会回答您的问题 @987654330 @.. 另外,在使用 Microsoft Graph API 时,我不太关注您的问题。如果您能详细说明,我或其他人可能会提供帮助

标签: azure-active-directory microsoft-graph-api


【解决方案1】:

1.获取组成员声明作为令牌的一部分

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

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

一旦应用程序清单按上述方式更新,您就可以获取组 ID 作为声明的一部分。这是解码的 JWT 令牌的快速示例

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

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

4.相关的 Microsoft Graph API

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

Check member groups

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

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

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

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

user: getMemberGroups

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

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

这是另一个related SO Post

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2018-07-26
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多