Приглашение пользователей через Microsoft.Graph выдает ошибку - PullRequest
0 голосов
/ 05 марта 2019

Ожидаемое поведение

Следует пригласить пользователя, а затем обновить пользователя с некоторой дополнительной информацией https://docs.microsoft.com/en-us/graph/api/invitation-post?view=graph-rest-1.0

Фактическое поведение

Источник

"Microsoft.Graph.Core"

Сообщение

"Code: Unauthorized\r\nMessage: Insufficient privileges to perform requested operation by the application '00000003-0000-0000-c000-000000000000'. ControllerName=MSGraphInviteAPI, ActionName=CreateInvite, URL absolute path=/api/9cXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/invites\r\n\r\nInner error\r\n"

StackTrace

   at Microsoft.Graph.HttpProvider.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.BaseRequest.SendRequestAsync(Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Microsoft.Graph.BaseRequest.SendAsync[T](Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Web.Api.Infrastructure.Infrastructure.Repositories.AzureRepository.CreateUser(CreateUserCommand user) in C:\Users\SamPrecious\source\repos\Adept\src\adept-web-api\Web.Api.Infrastructure\Infrastructure\Repositories\AzureRepository.cs:line 166

Шаги для воспроизведения поведения

Версия SDK: netcoreapp2.2
"Microsoft.Graph" Version = "1.13.0" "Microsoft.Graph.Core" Version = "1.13.0"

Версия IDE: Код VS - 1.31.1 Vsiual Studio Enterprise 2017 - 4.7.03056

У меня есть этот метод (перемещение кода для создания GraphServiceClient в метод, чтобы доказать свою точку зрения) Клиент аутентифицируется с помощью регистрации приложения (я получаю маркер доступа обратно), но когда запускается код для приглашения, authenticContext.AcquireTokenAsync снова запускается, и я получаю ошибку с трассировкой стека выше. Клиентское приложение имеет User.Invite.All, User.ReadWrite.All, Directory.ReadWrite.All в соответствии с документацией API.

Почему AppId меняется в коде на тот, который указан в сообщении выше?

public async Task<string> CreateUser(CreateUserCommand user)
        {
            try
            {
                var clientCredential = new ClientCredential(_configuration["appId"], _configuration["secret"]);
                var authenticationContext = new AuthenticationContext(_configuration["authority"]);
                var authenticationResult = authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential).Result;

                var delegateAuthProvider = new DelegateAuthenticationProvider((requestMessage) =>
                {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", authenticationResult.AccessToken);

                    return Task.FromResult(0);
                });

                var con = new GraphServiceClient(delegateAuthProvider);

                //invite user
                Invitation invitation = new Invitation();
                invitation.InvitedUserDisplayName = user.Name;
                invitation.SendInvitationMessage = true;
                invitation.InvitedUserEmailAddress = user.Email;
                invitation.InviteRedirectUrl = "http://localhost";
                var result = await con.Invitations.Request().AddAsync(invitation);

                //update user
                var aadUser = _connection.GetConnection().ActiveDirectoryUsers.GetById(result.Id);
                var updateUser = result.InvitedUser;
                updateUser.DisplayName = user.Name;
                updateUser.Surname = user.Surname;
                updateUser.Mail = user.Email;
                updateUser.MobilePhone = user.Phone;
                await con.Users[result.InvitedUser.Id].Request().UpdateAsync(updateUser);
                return aadUser.UserPrincipalName;
            }
            catch (System.Exception)
            {

                throw;
            }


        }

Команда CreateUserCommand:

public class CreateUserCommand
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }

Вот захват регистрации приложения appreg

Разрешения: permissions

Идентификатор приложения в объекте IConfiguration configuration

1 Ответ

2 голосов
/ 05 марта 2019

Делегированные разрешения имеют значение, только когда вы вызываете API в контексте пользователя.

Поскольку вы используете учетные данные клиента, пользователя нет.Применяются только разрешения приложения, поэтому установите правильные разрешения там.

Кроме того, поскольку у вас есть асинхронная функция, также лучше дождаться токена:

var authenticationResult = await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", clientCredential);
...