Получите токен Azure AD от имени пользователя - NetCore2 - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь получить токен Azure AD от имени пользователя, чтобы получить доступ к некоторым ресурсам через приложение Azure AD (приложение подключается к API SharePoint Online).

Моя проблема заключается в получении токена от имени пользователя. Я добавил приложение Azure AD с разрешениями в качестве метода Auth в свое приложение (автоматически добавляется с помощью Visual Studio 2017). Есть ли способ получить токен от имени пользователя, используя встроенную аутентификацию? (так как он уже перенаправляет пользователя на вход, если он еще этого не делает).

Я пробовал что-то подобное, но я предполагаю, что этот токен предназначен для приложения, а не от имени пользователя (и выдает 401, если я пытаюсь получить доступ к SharePoint).

string clientId = 'xxxxxxxx';
string clientSecret = 'xxxxxxxxx'
var credential = new ClientCredential(clientId, clientSecret);

AuthenticationResult result = await authContext.AcquireTokenAsync("https://MYSITE.onmicrosoft.com/APPID", credential);

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Есть ли способ получить токен от имени пользователя, используя встроенную аутентификацию? (так как он уже перенаправляет пользователя на вход, если он еще этого не делает).

Да, после аутентификации пользователя вы должны приобрести токен доступа для доступа к API SharePoint Online / Microsoft Graph API.

Вы можете использовать промежуточное программное обеспечение OpenID Connect и библиотеку аутентификации Active Directory (ADAL.NET) для получения токена-носителя JWT для вошедшего в систему пользователя с использованием протокола OAuth 2.0:

// Because we signed-in already in the WebApp, the userObjectId is know
string userObjectID = (User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;

// Using ADAL.Net, get a bearer token to access the TodoListService
AuthenticationContext authContext = new AuthenticationContext(AzureAdOptions.Settings.Authority, new NaiveSessionCache(userObjectID, HttpContext.Session));
ClientCredential credential = new ClientCredential(AzureAdOptions.Settings.ClientId, AzureAdOptions.Settings.ClientSecret);
result = await authContext.AcquireTokenSilentAsync(AzureAdOptions.Settings.TodoListResourceId, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

Вы можете обратиться к примеру кода: Вызов веб-API в веб-приложении ASP.NET Core с использованием Azure AD . Замените ресурс на SharePoint Online API / Microsoft Graph API, чтобы удовлетворить ваши требования.

Я пробовал что-то подобное, но я предполагаю, что этот токен предназначен для приложения, а не от имени пользователя (и выдает 401, если я пытаюсь получить доступ к SharePoint).

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

0 голосов
/ 05 ноября 2018

Я пытаюсь получить токен Azure AD от имени пользователя, чтобы получить доступ к некоторым ресурсам через приложение Azure AD (приложение подключается к API SharePoint Online).

Если мы хотим получить доступ к точке доступа, нам нужно создать приложение в Azure AD, которое имеет разрешения для доступа к API. И не забудьте предоставить разрешения.

График Microsoft позволяет разработчикам получать доступ к данным из нескольких облачных служб Microsoft, включая:

  • Azure AD (для пользователей и групп)
  • Офис 365
  • SharePoint Online
  • Exchange Online
  • OneDrive для бизнеса
  • OneNote
  • Планировщик
  • Excel
  • OneDrive Consumer
  • Outlook.com

enter image description here

Другое дело, что ресурс должен быть https://graph.microsoft.com, а не ваше приложение.

Ниже приведен демонстрационный код

 private static async Task<string> GetAppTokenAsync(string tenantId, string clientId, string username,string password)
 {  
    var graphResource = "https://graph.microsoft.com";
     string aadInstance = "https://login.microsoftonline.com/" + tenantId + "/oauth2/token";
     //Instantiate an AuthenticationContext for my directory (see authString above).
     AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance, false);
     // Create a ClientCredential that will be used for authentication.
     //This is where the Client ID and Key / Secret from the Azure Management Portal is used.
     UserPasswordCredential credential = new UserPasswordCredential(username, password); //username is email format
     // Acquire an access token from Azure AD to access the Azure Microsoft Graph(the resource)
     //  using the Client ID and Key / Secret as credentials.
     AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(graphResource, clientId, credential);
     // Return the access token.
     return authenticationResult.AccessToken;

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