Как проверить, входит ли пользователь в группу AD через Azure AD?

Технические характеристики установки

  • .NET 4.5.1 MVC Project
  • Проект содержит файлы.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 не так, как это было выстрелом в темноте.

1 ответ

Решение

1. Получение заявок на членство в группе как часть токена

Вы можете разрешить вход групповых заявок в качестве маркера доступа для вашего приложения, отредактировав манифест приложения (это можно сделать непосредственно на портале Azure) и установив параметр "groupMembershipClaims" собственность на "All" или же "SecurityGroup" по мере необходимости.

2. Идентификаторы группы возвращаются как часть претензий

После обновления манифеста приложения, как указано выше, вы можете получить идентификаторы группы как часть утверждений. Вот быстрый пример для декодированного токена JWT

3. Ограничение на количество групп, которые могут быть возвращены как часть токена.

Чтобы размер маркера не превышал ограничения размера заголовка HTTP, Azure AD ограничивает число идентификаторов объектов, включаемых в утверждение групп. Если пользователь является участником большего числа групп, чем предел превышения (150 для токенов SAML, 200 для токенов JWT), то Azure AD не отправляет утверждение группы в токене. Вместо этого он включает избыточное требование в токене, которое указывает приложению на запрос API Graph для получения членства в группе пользователя.

4. Соответствующие API Microsoft Graph

ПРИМЕЧАНИЕ. Работа с API-интерфейсами Microsoft Graph может быть довольно мощной, поскольку вы можете обойти более сложные сценарии, а также получить все другие виды информации о группах, если это необходимо (например, имя). В данном конкретном случае, поскольку целью является проверка членства в группе, идентификатор группы является лучшим полем, поскольку он не изменится, в то время как другие, такие как имя, могут.

Проверьте группы участников

Этот будет полезен, если вы уже знаете группы, в которых вы хотите проверить / утвердить членство.

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

В теле запроса вы можете указать groupdIds т.е. коллекция, содержащая идентификаторы объектов групп, в которых проверяется членство. Можно указать до 20 групп.

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

пользователь: getMemberGroups

Этот будет полезен, если вы еще не знаете группу и хотите получить все группы, к которым принадлежит этот пользователь.

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

Вот еще один связанный пост SO

Другие вопросы по тегам