Проблемы с доступом к данным Microsoft Graph API - PullRequest
1 голос
/ 30 апреля 2019

В настоящее время возникают проблемы при интеграции Microsoft Graph API в мое ASP.NET Core 2.2 веб-приложение (MVC).При этом используется «Учетные записи рабочих или учебных заведений» : «Облако - единая организация» с использованием Двухфакторная аутентификация входа в Azure .

Использование Пример кода 1 код Я пытаюсь получить запрос графа: -

https://graph.microsoft.com/v1.0/me/

, возвращающий фамилию из заголовка ответа

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

var objMessages = objGraphClient.Me.Request().GetAsync().Result;

С сообщением об ошибке: " не существуетили один из его запрашиваемых объектов ссылочных свойств отсутствует".

// #############
// Code Sample 1
// #############

// Graph Api.
string strResource = "https://graph.microsoft.com";
string SecretId = "<Secret Id>";

// Azure Ad.
Uri strInstance = new Uri("https://login.microsoftonline.com/");
string strDomain = "<Domain>.onmicrosoft.com";
string strTenantId = "<Tenant Id>";
string strClientId = "<Client Id>";
string strCallbackPath = "/signin-oidc";

// The authority to ask for a token: your azure active directory.
string strAuthority = new Uri(strInstance, strTenantId).AbsoluteUri;
AuthenticationContext objAuthenticationContext = new AuthenticationContext(strAuthority);
ClientCredential objClientCredential = new ClientCredential(strClientId, SecretId);

// Acquire Token.
AuthenticationResult objAuthenticationResult = objAuthenticationContext.AcquireTokenAsync(strResource, objClientCredential).Result;

// Get bearer token.
GraphServiceClient objGraphClient = new GraphServiceClient(new DelegateAuthenticationProvider(
async request =>
    {
    // This is adding a bearer token to the httpclient used in the requests.
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", objAuthenticationResult.AccessToken);
    }));

// The next line produces an error :: does not exist or one of its queried reference-property objects are not present.
var objResult = objGraphClient.Me.Request().GetAsync().Result;

Debug.WriteLine($"{objResult.Surname}");

Если я изменю Пример кода 1 выше на Пример кода 2 нижепередача запроса tokenPlease (), полученного из Microsoft Graph Explorer после успешного входа в систему, работает, возвращая фамилию успешно, указывая, что их токен возможен в моем маркере Bearer: -

// #############
// Code Sample 2
// #############

// Get bearer token.
GraphServiceClient objGraphClient = new GraphServiceClient(new DelegateAuthenticationProvider(
async request =>
    {
    // This is adding a bearer token to the httpclient used in the requests.
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer","ERf54f2f...Etc");
    }));

// The next line now works.
var objResult = objGraphClient.Me.Request().GetAsync().Result;

Debug.WriteLine($"{objResult.Surname}");

Любая помощь поэто будет высоко ценится!

1 Ответ

1 голос
/ 02 мая 2019

Вы используете библиотеку ADAL, которая использует старую конечную точку аутентификации Azure AD V1. Вы должны использовать библиотеку MSAL, которая использует конечную точку аутентификации Azure AD V2.

Я бы посоветовал упростить вашу жизнь и взять пакет Microsoft.Graph.Auth Nuget, а затем использовать этот код вместо того, чтобы создавать свой собственный DelegateAuthenticationProvider

IConfidentialClientApplication clientApplication = AuthorizationCodeProvider.CreateClientApplication(clientId, redirectUri, clientCredential);
AuthorizationCodeProvider authenticationProvider = new AuthorizationCodeProvider(clientApplication, scopes); 
...