Ошибка проверки токена доступа Microsoft Graph API - PullRequest
3 голосов
/ 15 октября 2019

Я создаю console application в C #.
Я хочу сделать некоторые вызовы Microsoft Graph API для доступа и редактирования некоторых файлов Excel в моем SharePoint , поэтому яЯ могу автоматизировать некоторые процессы в моей организации.


Логика приложения проста.

  1. Я вызываю Azure Active Directory на , чтобы подтвердить подлинность этого консольного приложения, используя поток учетных данных клиентов , что означает, что мы предоставим clientID и AppKey. Я взял clientID и AppKey из Azure Active Directory> Регистрация приложений . enter image description here
  2. Затем я хочу получить токен доступа и использовать его для отправки GET-запроса к Microsoft Graph API .
    Например https://graph.microsoft.com/v1.0/me/

    Но тогда ответ Я получаю это:

{
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure. Invalid audience.",
    "innerError": {
      "request-id": "0a3ec**************",
      "date": "2019-10-15T13:54:33"
    }
  }
}

Ниже вы найдете полный код моего приложения с двумя методами получения токена доступа и вызова Graph API:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IdentityModel.Tokens;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using AuthenticationContext = Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext;

namespace Project_Budget
{
    class Program
    {
        private const string clientId = "14f1****************";
        private const string aadInstance = "https://login.microsoftonline.com/{0}";
        private const string tenant = "******.onmicrosoft.com";
        private const string resource = "https://graph.windows.net";
        private const string appKey = "IKV***********";
        static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

        private static HttpClient httpClient = new HttpClient();
        private static AuthenticationContext context = null;
        private static ClientCredential credential = null;

        static void Main(string[] args)
        {
            context = new AuthenticationContext(authority);
            credential = new ClientCredential(clientId,appKey);

            Task<string> token = GetToken();
            token.Wait();
            //Console.WriteLine(token.Result + "\n");

            Task<string> graphCall = GetExcelFile(token.Result);
            graphCall.Wait();
            Console.WriteLine(graphCall.Result + "\n");
            Console.ReadLine();

        }

        private static async Task<string> GetExcelFile(string result)
        {
            string apiJsonResult = null;
            
            var apiCallString = "https://graph.microsoft.com/v1.0/me/";
         
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result);
            var getResult = await httpClient.GetAsync(apiCallString);

            if (getResult.Content != null)
            {
                apiJsonResult = await getResult.Content.ReadAsStringAsync();
            }

            
            return apiJsonResult;
        }

        private static async Task<string> GetToken() 
        {
            AuthenticationResult result = null;
            string token = null;
            result = await context.AcquireTokenAsync(resource, credential); //authentication context object
            token = result.AccessToken;
            return token;
        }

        
    }
}

Я предоставил весь доступ , необходимый для запуска приложения. Также я запускаю запрос на Graph Explorer и работает правильно.
enter image description here Почему я получаю эту ошибку в консольном приложении?

Ответы [ 2 ]

1 голос
/ 15 октября 2019

В идеале ресурс должен быть

private const string resource = "https://graph.microsoft.com";

Но вам все равно нужно выбрать области, на которые вы хотите ориентироваться в своем приложении. То, как вы делаете это в настоящий момент, похоже, приобретает / устанавливает соответствующие области, которые сделаны для вас с помощью Graph Explorer.

Я бы посоветовал после этого краткого руководства о том, как создать консоль ядра dot net. приложение, и вы должны быть в рабочем состоянии в кратчайшие сроки. Он использует библиотеку MSAL, которая работает лучше, чем библиотека ADAL, которую вы используете в своем сценарии.

https://docs.microsoft.com/en-us/graph/tutorials/dotnet-core

1 голос
/ 15 октября 2019

Мне кажется, проблема в значении resource, которое вы указываете в своем коде.

Текущий код: (Это значение ресурса https://graph.windows.net соответствует API-интерфейсу Azure AD Graph, который является более старым API)

private const string resource = "https://graph.windows.net";

Попробуйте изменить это на: (Это значение ресурса https://graph.microsoft.com соответствует более новому Microsoft Graph API, который вы вызываете в коде, который приходит позже var apiCallString = "https://graph.microsoft.com/v1.0/me/";)

private const string resource = "https://graph.microsoft.com";
...