如何通过Azure AD检查用户是否在AD组中?

时间:2019-03-21 20:11:35

标签: azure-active-directory microsoft-graph

设置规范

  • .NET 4.5.1 MVC项目
  • 项目包含.aspx文件(旧版)
  • 当前用户是用于通过Cookie进行身份验证的Azure AD。
  • 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不能这样做,因为它是在黑暗中拍摄的。

1 个答案:

答案 0 :(得分:3)

1。将组成员资格声明作为令牌的一部分

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

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

如上所述,一旦更新了应用清单后,您就可以获取组ID。这是解码的JWT令牌的快速示例

enter image description here

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