Microsoft график получить доступ без пользователя, чтобы получить события календаря - PullRequest
1 голос
/ 09 апреля 2020

Я создаю ASP. Net MVC приложение, которое использует сценарий «получить доступ без пользователя», и я предоставил все необходимые разрешения в качестве разрешения приложения (Calendars.Read) с согласия администратора. Я уже могу получить токен и могу использовать этот токен для успешного получения профиля пользователя. Но когда я пытаюсь получить данные о событиях календаря, он получает код ошибки «AuthenticationError» и сообщение об ошибке «Ошибка аутентификации с помощью ресурса». Я использую C# код, подобный следующему:

var events = await graphClient.Users[principalName].Events
            .Request()
            .GetAsync();

Может ли кто-нибудь подсказать, что я пропустил или Какое разрешение мне следует использовать?

Мой код для проверки подлинности выглядит следующим образом, наконец-то я добавил «WithExtraQueryParameters», чтобы убедиться, что я использую grant_type, это client_credentials

private static GraphServiceClient GetAuthenticated()
    {
        AuthenticationResult result = null;

        var query = new Dictionary<string, string>();
        query.Add("grant_type", "client_credentials");
        var idClient = ConfidentialClientApplicationBuilder
                            .Create(appId)
                            .WithAuthority(AzureCloudInstance.AzurePublic, $"{tenantId}")
                            .WithClientSecret(appSecret)
                            .WithExtraQueryParameters(query)
                            .Build();

        string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

        ClientCredentialProvider authenticationProvider = new ClientCredentialProvider(idClient);

        return new GraphServiceClient(new DelegateAuthenticationProvider(
            async (requestMessage) => {
                var accounts = await idClient.GetAccountsAsync();
                if (accounts.Any())
                {
                    result = await idClient.AcquireTokenSilent(graphScopes?.Split(','), accounts.FirstOrDefault()).ExecuteAsync();
                }
                else {
                    result = await idClient.AcquireTokenForClient(scopes).ExecuteAsync();
                }

                requestMessage.Headers.Authorization =
                    new AuthenticationHeaderValue("Bearer", result.AccessToken);
            }
        ));
    }

Ответы [ 3 ]

0 голосов
/ 12 апреля 2020

Не знаю, что не так с вашим кодом. Я могу предложить вам использовать Microsoft Graph SDK. Посмотрите на Microsoft graph auth . И не забудьте о клиенте Microsoft Identity . Объединение этих двух пакетов упростит процесс аутентификации и предотвратит такие ошибки.

Если вы решите их использовать. Ваша аутентификация будет выглядеть следующим образом:

var app = ConfidentialClientApplicationBuilder.Create("client id")
                    .WithClientSecret("client secret")
                    .WithTenantId("your tenant id")
                    .WithAuthority(AadAuthorityAudience.AzureAdMyOrg)
                    .Build();
var authProvider = new ClientCredentialProvider(app);
var graphClient = new GraphServiceClient(authProvider);

А затем используйте graphClient для создания запросов к графу Microsoft. Дайте мне знать, если что-то не так go.

0 голосов
/ 13 апреля 2020
var confidentialClient = ConfidentialClientApplicationBuilder
                .Create(clientId)
                .WithTenantId(tenantId)
                .WithClientSecret(clientSecret)
                .Build();

                var graphClient = new GraphServiceClient(new ClientCredentialProvider(confidentialClient));

                var evnts = await graphClient.Users["coyote@acme.com"].Events.Request().GetAsync();

Это работает, когда ваш клиентский секрет, арендатор совпадает, и вы установили права доступа к приложению.

Что не работает, так это (ожидающий мой билет @MS):

    var tasks = await graphClient.Users["coyote@acme.com"].Outlook.Tasks
.Request()
.GetAsync();

Привет

0 голосов
/ 09 апреля 2020

Попробуйте добавить разрешения: Calendars.ReadWrite, OnlineMeetings.Read.All, OnlineMeetings.ReadWrite.All

...