Несанкционированный / токен не содержит разрешения при попытке использовать Microsoft Graph для отправки электронной почты - PullRequest
0 голосов
/ 14 марта 2020

У нас есть зарегистрированное приложение в Azure AD и мы настроили клиентские секреты для запуска его как приложения-демона (без взаимодействия с пользователем). У нас есть разрешения API Mail.Send и User.Read admin, одобренные для Microsoft Graph API.

Насколько я понимаю, я использую конструкцию ConfidentialClientApplication для получения токена доступа для зарегистрированного приложения, с помощью которого я могу создать GraphServiceClient. Затем я могу использовать клиент для отправки электронной почты как пользователь.

Но я получил следующее исключение о том, что в токене нет разрешения: (но я предоставил область для получения разрешения)

Message: The token contains no permissions, or permissions can not be understood.
Inner error:
        AdditionalData:
        request-id: omitted-xxxx-xxx-...31c53
        date: 2020-03-13T23:41:08
ClientRequestId: omitted-xxxx-xxx-...31c57

   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(Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at GraphCallsFromServiceAccount.MyGraphClient.SendEmail(GraphServiceClient graphClient) in C:\Users\xxxx\source\repos\GraphCallsFromAccount\MyGraphClient.cs:line 109

Соответствует Код:

// create a ConfidentialClientApplication:
var app = ConfidentialClientApplicationBuilder.Create(AppClientId)
                .WithAuthority(new Uri("https://login.microsoftonline.com/"+ TenantId + "/oauth2/v2.0/token"))
                .WithClientSecret(ClientSecretString)
                .Build();

            var scopes = new string[] { "https://graph.microsoft.com/.default" }; // if changed to "Mail.Send", it throws errors saying invalid scope.
            GraphServiceClient graphClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    async (requestMg) =>
                    {
                        // add access token to header
                        var result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
                        requestMg.Headers.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);
                    }));

  // send email:
try
            {
                var toAddress = "john_doe@helloworld.com";
                var SenderAddress = "jane_doe@helloworld.com";
                var recipient = new Recipient()
                {
                    EmailAddress = new EmailAddress()
                    {
                        Name = "John Doe",
                        Address = toAddress,
                    }
                };

                Message email = new Message
                {
                    Body = new ItemBody
                    {
                        Content = "<b>hello world</b>",
                        ContentType = BodyType.Html,
                    },
                    Subject = "hello world",
                    ToRecipients = new List<Recipient>() { recipient },
                };

                Console.WriteLine("hello 2");
                await graphClient.Users["john_doe@helloworld.com"].SendMail(email, false).Request().PostAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine("ex: " + ex);
            }

Как запросить правильные разрешения, введенные в токен доступа? Спасибо за помощь

1 Ответ

0 голосов
/ 14 марта 2020

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

Вам необходимо добавить разрешение приложения Mail.Send в Microsoft Graph API, и администратор должен согласиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...