1

Я пытаюсь получить доступ к MS Graph с помощью учетной записи AAD, эта учетная запись является глобальным администратором и имеет все права делегирования. Я хочу сделать это без интерактивного входа, используя UserPasswordCredential. При попытке получить доступ к MS Graph Я получаю ошибку:Ошибка проверки доступа к токену MS Graph с использованием UserCredentials

enter image description here

Мой поток:

Получение токена:

public async Task<string> GetUserAccessTokenAsync() 
     { 
      UserPasswordCredential userPasswordCredential = new UserPasswordCredential("[email protected]", "password"); 
      AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/tenant.onmicrosoft.com"); 
      AuthenticationResult token = await authContext.AcquireTokenAsync("https://graph.windows.net", appId, userPasswordCredential); 

      return token.AccessToken; 
     } 

с помощью маркера:

public static GraphServiceClient GetAuthenticatedClient() 
     { 
      GraphServiceClient graphClient = new GraphServiceClient(
       new DelegateAuthenticationProvider(
        async (requestMessage) => 
        { 
         Adal adal = new Adal(); 
         string accessToken = await adal.GetUserAccessTokenAsync(); 

         // Append the access token to the request. 
         requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken); 
        })); 
      return graphClient; 
     } 

Попытка позвонить MS Graph для чтения событий:

try 
     { 
      // Get events. 
      items = await eventsService.GetMyEvents(graphClient); 
     } 
     catch (ServiceException se) 
     { 
      //this is where I get the error 
     } 

делегированы разрешения: enter image description here

Любые идеи, где я неправильно?

ответ

2

Ну, по крайней мере, ваш ресурс URI. Оно должно быть:

public async Task<string> GetUserAccessTokenAsync() 
{ 
    UserPasswordCredential userPasswordCredential = new UserPasswordCredential("[email protected]", "password"); 
    AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/tenant.onmicrosoft.com"); 
    AuthenticationResult token = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", appId, userPasswordCredential); 

    return token.AccessToken; 
} 

https://graph.windows.net/ для Azure AD Graph, а не MS Graph.

Для MS Graph API вы должны использовать https://graph.microsoft.com/.

+0

Господин ... Иногда я удивляюсь даже самому себе. Спасибо за это, никогда бы не заметили. –

+1

Я опечатал ресурс URI в примере кода, теперь он исправлен. – juunas

0

После проведения большего исследования я понимаю, что нам нужно получить разрешения администратора. Найденные в документах: «Области только для приложений (также известные как роли приложений) предоставляют приложению полный набор привилегий, предлагаемых областью действия. Области только для приложений обычно используются приложениями, которые запускаются как служба без входа пользователя присутствующий " https://graph.microsoft.io/en-us/docs/authorization/permission_scopes Я получаю успешный результат с пользовательским токеном, поскольку он был под делегированными разрешениями. Надеюсь, это поможет кому-то в будущем.

0

После дальнейших исследований, похоже, нам нужны разрешения администратора, поскольку мы используем только области приложения, а не делегированные разрешения . Основные операции чтения в области только для приложения назначаются только администратором. Надеюсь, это поможет кому-то, имеющему ту же проблему. https://graph.microsoft.io/en-us/docs/authorization/permission_scopes