Я использую удостоверение приложения из Azure AD с предоставленными разрешениями на чтение и запись. Я также запустил Grant-CsApplicationAccessPolicy, чтобы удостоверение приложения имело право на создание онлайн-собрания от имени реального удостоверения пользователя из Azure AD.
Я знаю, что моя установка работает с получением пользователя из графического API. Однако я получаю сообщение об ошибке после выполнения следующего:
var confidentialClient = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}/v2.0")
.WithClientSecret(clientSecret)
.Build();
GraphServiceClient graphServiceClient =
new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(async (requestMessage) =>
{
var authResult = await confidentialClient
.AcquireTokenForClient(scopes)
.ExecuteAsync();
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
})
);
var onlineMeeting = new OnlineMeeting
{
StartDateTime = DateTimeOffset.Parse("2020-12-25T21:30:34.2444915+00:00"),
EndDateTime = DateTimeOffset.Parse("2020-12-25T22:00:34.2464912+00:00"),
Subject = "User Token Meeting 1"
};
var meetingInstance = await graphServiceClient.Me.OnlineMeetings
.Request()
.AddAsync(onlineMeeting);
Сообщение об ошибке выглядит следующим образом: почему в AAD говорится, что поиск пользователя по идентификатору пользователя не выполнен?
Статус: не найдено (404) Идентификатор операции: 8d06ff01-1dc3-49d1-9ced-9db6a919b162
ClientCorrelationId: 53b4478e-ba86-48ca-bb5b-25e5ef50c187
Ошибка сервера: не удалось выполнить поиск пользователя по идентификатору пользователя в AAD.
Исключение клиента: обработка HTTP-запроса привела к возникновению исключения. Дополнительные сведения см. в HTTP-ответе, возвращаемом свойством Response этого исключения.
Внутренняя ошибка:
Дополнительная информация:
дата: 2020-12-16T21:08:31
идентификатор запроса: d60858cf-5ef5-4a0d-8d67-181f80ed6c35
идентификатор запроса клиента: d60858cf-5ef5-4a0d-8d67-181f80ed6c35
ClientRequestId: d60858cf-5ef5-4a0d-8d67-181f80ed6c35
в Microsoft.Graph.HttpProvider.SendAsync (запрос HttpRequestMessage, HttpCompletionOption completeOption, CancellationToken CancellationToken) в Microsoft.Graph.BaseRequest.SendRequestAsync (объект, сериализуемый объект, CancellationToken, CancellationToken, HttpCompletionOption, завершениеOption) в Microsoft.Graph.BaseRequest.SendAsync[T] (сериализуемый объект объекта, CancellationToken CancellationToken, HttpCompletionOption CompleteOption) в MSTeam.Program.Main(String[] args) в D:\VSTS\msteam\MSTeam\MSTeam\Program.cs:строка 62
какой идентификатор пользователя я должен указать там? Я думал, что когда я создаю graphServiceClient, я уже передаю идентификатор клиента и секрет клиента удостоверения приложения, чтобы он знал, что это от удостоверения приложения. Выше я обновил информацию о том, как я создал экземпляр графового клиента.
Если мой ответ полезен для вас, вы можете принять его как ответ. Это может быть полезно другим участникам сообщества. Спасибо.
Дев прав.
На основании этого документа:
Запрос при использовании токена приложения:
POST /users/{userId}/onlineMeetings
.
Поэтому вы должны использовать graphServiceClient.Users["{userId}"].OnlineMeetings
вместо graphServiceClient.Me.OnlineMeetings
здесь.
userId
— идентификатор объекта пользователя. Когда вы настраиваете политику доступа к приложению, вам необходимо предоставить политику пользователю:
Grant-CsApplicationAccessPolicy -PolicyName Test-policy -Identity "ddb80e06-92f3-4978-bc22-a0eee85e6a9e"
ddb80e06-92f3-4978-bc22-a0eee85e6a9e
это именно userId
.
Мой код для справки:
// Configure the MSAL client as a confidential client
var confidentialClient = ConfidentialClientApplicationBuilder
.Create("{client_id}")
.WithTenantId("{tenant_id}")
.WithClientSecret("{client_secret}")
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClient);
GraphServiceClient graphServiceClient = new GraphServiceClient(authProvider);
var onlineMeeting = new OnlineMeeting
{
StartDateTime = DateTimeOffset.Parse("2021-01-12T21:30:34.2444915+00:00"),
EndDateTime = DateTimeOffset.Parse("2021-01-12T22:00:34.2464912+00:00"),
Subject = "User Token Meeting123"
};
var meeting = await graphServiceClient.Users["{userId}"].OnlineMeetings
.Request()
.AddAsync(onlineMeeting);
когда вы пытаетесь использовать идентификатор приложения, то почему вы хотите называть его «я», что предназначено для делегированного идентификатора. Вы должны использовать вызов API «graph.microsoft.com/v1.0/users/user-id/onlinemeetings», и он будет работать для вас.