Получить Entra ID пользователя AD из API Microsoft Graph, используя адрес электронной почты?

Я пытаюсь получить Entra Id пользователя с его адреса электронной почты, прежде чем добавлять его в определенную группу с помощью API Microsoft Graph через веб-приложение .Net.

На портале Azure я зарегистрировал приложение и создал секрет клиента для использования потока аутентификации учетных данных клиента. Для разрешений API мне предоставлены User.Read и User.Read.All в клиенте нашей компании.

Я создаю свой GraphServiceClient, используя следующий код:

public MicrosoftGraphService(IConfiguration configuration)
{
    var scopes = new[] { "https://graph.microsoft.com/.default" };

    var tenantId = configuration["MicrosoftGraph:TenantId"];
    var clientId = configuration["MicrosoftGraph:ClientId"];
    var clientSecret = configuration["MicrosoftGraph:Secret"];
    var options = new ClientSecretCredentialOptions
    {
        AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
    };

    var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);

    _graphServiceClient = new GraphServiceClient(clientSecretCredential, scopes);
}

Я вызываю API Graph, передавая адрес электронной почты, пытаясь получить объект пользователя, где я могу прочитать идентификатор Entra. Я делаю это, используя следующий код:

public async Task<GraphUser> GetUserAsync(string emailAddress)
{
    try
    {
        var foundUser = await _graphServiceClient.Users[emailAddress].GetAsync();
        var user = (new GraphUser()
        {
            UserId = foundUser.Id,
            DisplayName = foundUser.DisplayName,
            Email = emailAddress
        });

        return user;
    }
    catch
    {
        // Not found in AD
        return null;
    }
}

Однако, когда он вызывает вызов _graphServiceClient.Users[emailAddress].GetAsync(), я получаю сообщение об ошибке: «Недостаточно привилегий для завершения операции».

Из документации, которую я прочитал, наличие разрешения API User.Read.All, предоставленного приложению, должно быть достаточным для получения данных. Что я делаю не так?

Можете ли вы прикрепить снимок экрана с разрешениями API, предоставленными приложению Microsoft Entra?

Rukmini 25.03.2024 14:52

Я добавил предоставленные разрешения.

dickiebow 25.03.2024 15:23

Пожалуйста, проверьте ответ ниже. Вам необходимо предоставить разрешение API типа приложения User.Read.All, поскольку вы используете поток учетных данных клиента.

Rukmini 25.03.2024 15:25

@Рукмини, спасибо. Теперь я вижу ошибку. У меня есть делегированное разрешение Read.User.All, а не разрешение уровня приложения. Спасибо за вашу помощь.

dickiebow 25.03.2024 15:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
805
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка «Недостаточно прав для завершения операции» обычно возникает, если приложение Microsoft Entra ID не имеет необходимых разрешений для выполнения действия.

Первоначально я получил ту же ошибку:

Чтобы устранить эту ошибку, обязательно предоставьте User.Read.All разрешение API типа приложения, поскольку вы используете поток учетных данных клиента.

  • User.Read.All Разрешение API делегированного типа должно быть предоставлено, когда вы используете интерактивный поток пользователя.

Предоставьте разрешение API типа приложения User.Read.All, как показано ниже:

Я могу успешно получить пользователей с UPN, как показано ниже:

using Microsoft.Graph;
using Azure.Identity;
using Microsoft.Graph.Models.ODataErrors;

class Program
{
    static async Task Main(string[] args)
    {
        var scopes = new[] { "https://graph.microsoft.com/.default" };
        var clientId = "ClientID";
        var tenantId = "TenantID";
        var clientSecret = "ClientSecret";

        var options = new ClientSecretCredentialOptions
        {
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
        };

        var clientSecretCredential = new ClientSecretCredential(
            tenantId, clientId, clientSecret, options);
        var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

        try
        {
            var result = await graphClient.Users["[email protected]"].GetAsync();
            Console.WriteLine($"User details: {result.DisplayName}, {result.Mail}, {result.Id}");
        }
            catch (ODataError odataError)
        {
            Console.WriteLine(odataError.Error?.Code);
            Console.WriteLine(odataError.Error?.Message);
            throw;
        }
    }
}

Ссылка:

Получить пользователя — Microsoft Graph v1.0 | Майкрософт

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