Как использовать MSAL для получения токена доступа от имени пользователя, использующего AAD v1? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть веб-приложение (Angular 7), которое использует MSAL Angular для аутентификации пользователей с помощью Azure AD и для получения маркеров доступа для доступа к моему веб-API (.NET 4.6). Оба приложения были зарегистрированы на портале Azure со следующими разрешениями, как описано здесь :

  • Веб-приложение: user_impersonation для веб-API (делегировано)
  • Веб-API: User.Read; Mail.Send для MS Graph (делегированный)

Теперь я бы хотел позвонить в Microsoft Graph из Web API, используя ADAL для .NET, чтобы получить данные от имени пользователя .

Следуя этой инструкции Я должен настроить consentScopes и protectedResourceMap, но, поскольку я использую AAD v1, я не могу использовать области с инкрементным согласием.

Как мне настроить мое веб-приложение для получения токена доступа для веб-API и MS Graph?

Я обнаружил , что можно получить токены для AAD v1.0 с помощью MSAL.js (и я могу общаться с моим веб-API), но я не знаю, как настроить это для от имени потока для связи Web API с MS Graph.

UPDATE

Вот код для запроса токена доступа из Web API:

string accessToken = null;
var userAssertion = new UserAssertion(
    <userAccessToken>, 
    "urn:ietf:params:oauth:grant-type:jwt-bearer", 
    userName);
var authority = "https://login.microsoftonline.com/" + <tenant> + "/";
var clientCredencial = new ClientCredential(<clientId>, <clientSecret>);
var authContext = new AuthenticationContext(authority, null);

try
{
    var authResult = await authContext.AcquireTokenAsync(
        "https://graph.microsoft.com", 
        clientCredencial, 
        userAssertion);
    accessToken = authResult.AccessToken;
}
catch (AdalServiceException ex) { throw; }

Веб-приложение добавляется как knownClientApplications в манифесте веб-API:

"knownClientApplications": [
    "<WebAppAppId>"
],

Это области, установленные в веб-приложении (MsalModule):

consentScopes:
[
    'https://webapi.example.com/user_impersonation'
],

В этом случае веб-приложение требует следующих разрешений на экране согласия:

  • Доступ WebAPIName
  • Доступ к вашим данным в любое время
  • Просмотр вашего основного профиля

Если я пытаюсь получить токен доступа для MS Graph, я получаю сообщение об ошибке:

{"AADSTS65001: пользователь или администратор не дал согласие на использование приложения с идентификатором« WebApiClientId »с именем« WebApiAppName ». Отправьте интерактивный запрос на авторизацию для этого пользователя и ресурса.}

1 Ответ

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

Как указывает сообщение об ошибке, вам не хватает согласия веб-API на доступ к Microsoft Graph от имени вошедшего в систему пользователя.

Предполагается, что вы уже настроили регистрацию приложения дляВеб-API для запроса соответствующих делегированных разрешений для Microsoft Graph. У вас есть три способа предоставить требуемое согласие.

  1. Предоставить согласие администратора на портале Azure. Еслиэто предназначено для использования только в вашем клиенте, администратор клиента может просто перейти к регистрации приложения для Web API и предоставить администратору согласие на необходимые разрешения.(См. Вариант 1 из этого ответа для получения снимков экрана и более подробной информации.)

  2. Предоставьте согласие администратора путем создания соответствующего URL-адреса. Альтернативаиспользование портала для предоставления согласия администратора - это создание URL согласия.В этом случае вы должны создать URL-адрес согласия для веб-API.(См. Вариант 2 из этого ответа для получения снимков экрана и более подробной информации.)

  3. Во время выполнения, во время согласия с веб-приложением, используя knownClientApplications.Если вы добавите AppId из Web App в список knownClientApplications в манифесте регистрации Web API , когда пользователя попросят дать согласие на Web App, онтакже будет предложено дать согласие на любые разрешения веб-API также необходимо.Если вы используете конечную точку v2 для входа в веб-приложение (похоже, что вы), этот подход работает только в том случае, если клиент запрашивает область по умолчанию (т. Е. Предварительно зарегистрированные разрешения, например, https://my.api.example.com/.default).

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