Получить информацию о моем пользователе с помощью MS Graph API

#c# #azure-active-directory #microsoft-graph-api

#c# #azure-active-directory #microsoft-graph-api

Вопрос:

Я пытаюсь получить свою информацию, используя Graph API SDK для C # (идея заключается в том, что приложение работает без взаимодействия с пользователем), как показано в примере кода ниже:

 IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create("xxx")
    .WithTenantId("xxx")
    .WithClientSecret("xxx")
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);


GraphServiceClient graphClient = new GraphServiceClient(authProvider);

var user = await graphClient.Me.Request()
    .Select(u => new
    {
        u.DisplayName,
        u.Mail,
        u.UserPrincipalName
    })
    .GetAsync();
 

Он возвращает ‘WaitingForActivation’ по статусу, я не знаю, в чем проблема.

Комментарии:

1. Не могли бы вы поделиться дополнительным кодом? Было бы полезно поделиться методом, в котором вы вызываете graphClient.Me.Request() . Проблема связана с async / await, а не с Graph API

2. @user2250152, метод запрашивается из теста API, это что-то очень простое.

Ответ №1:

Это не так, как вы думаете. Если вы вызываете /me конечную точку, вы должны войти в систему пользователя. Он фактически получает информацию о вошедшем в систему пользователе, поэтому вы не можете использовать поток учетных данных клиента для получения токена доступа. Для потока учетных данных клиента он обычно используется для межсерверных взаимодействий, которые должны выполняться в фоновом режиме и не взаимодействовать с пользователем немедленно (пользователь не вошел в систему). Для /me конечной точки он должен принимать токен пользователя, поскольку он взаимодействует с пользователем. Итак, я предлагаю вам использовать auth code flow для получения токена доступа, который требует от вас входа в систему для пользователя и получения кода авторизации, а затем использовать код авторизации для активации токена доступа.

Поставщик кода авторизации:

 IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithRedirectUri(redirectUri)
    .WithClientSecret(clientSecret) // or .WithCertificate(certificate)
    .Build();

AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(confidentialClientApplication, scopes);
 

Кстати, если вы хотите получить информацию о пользователе в сценарии, в котором ни один пользователь не вошел в систему, вы можете вызвать /users конечную точку:

 IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create("xxx")
    .WithTenantId("xxx")
    .WithClientSecret("xxx")
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);


GraphServiceClient graphClient = new GraphServiceClient(authProvider);

var user = await graphClient.Users["{userId or userPrincipalName}"].Request()
    .Select(u => new
    {
        u.DisplayName,
        u.Mail,
        u.UserPrincipalName
    })
    .GetAsync();
 

Комментарии:

1. Во-первых, большое вам спасибо за ваш ответ, я попробую ваше предложение. — — Как я могу получить свой ‘{userId или userPrincipalName}’? — Возможно ли получить список пользователей userId пользователей, которые не являются моими контактами или списком идентификаторов из моих контактов?

2. @AdrianoMarquesGonalvesdosS Это очень просто, у вас есть два способа получить идентификатор пользователя или имя пользователя. 1. Перейдите на портал Azure> AAD> Пользователи> Все пользователи i.stack.imgur.com/CwssH.png . 2. Запрос graph.microsoft.com/v1.0/users в обозревателе графиков , чтобы получить всю информацию о пользователе. Идентификатор пользователя — это идентификатор в вашем списке контактов.

3. Я использую Graph Explorer с образцом учетной записи по умолчанию, по-видимому, все отлично, но когда я вхожу в свою учетную запись, я не могу запросить graph.microsoft.com/v1.0/me/presence например, покажите мне неверный запрос (400), нужно ли мне что-либо включать в своей учетной записи?