Не удалось создать онлайн-собрание с идентификатором приложения с помощью GraphServiceClient

Я использую удостоверение приложения из 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

когда вы пытаетесь использовать идентификатор приложения, то почему вы хотите называть его «я», что предназначено для делегированного идентификатора. Вы должны использовать вызов API «graph.microsoft.com/v1.0/users/user-id/onlinemeetings», и он будет работать для вас.

Dev 22.12.2020 11:59

какой идентификатор пользователя я должен указать там? Я думал, что когда я создаю graphServiceClient, я уже передаю идентификатор клиента и секрет клиента удостоверения приложения, чтобы он знал, что это от удостоверения приложения. Выше я обновил информацию о том, как я создал экземпляр графового клиента.

qualizon 22.12.2020 18:46

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

Allen Wu 24.12.2020 07:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
447
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Дев прав.

На основании этого документа:

Запрос при использовании токена приложения: 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);

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