#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), нужно ли мне что-либо включать в своей учетной записи?