AAD: Как вы отправляете «интерактивный запрос авторизации» для разрешения AADSTS65001 при использовании MSAL, если это происходит не путем вызова acquTokenPopup? - PullRequest
3 голосов
/ 23 мая 2019

У меня есть одностраничное приложение, написанное на TypeScript. Он должен вызывать службу среднего уровня, а служба среднего уровня, в свою очередь, вызывает Microsoft Graph API.

В моем SPA я использую библиотеку MSAL и регистрирую пользователя, вызывая UserAgentApplication.loginRedirect ()

Затем я вызываю acquTokenPopup и передаю только одну область в параметре запроса маркера доступа: область, определенную моей службой среднего уровня. После этого я вижу всплывающее окно, но затем оно исчезает (я никогда не вижу никакого согласия). Это успешно получает токен, который SPA затем отправляет в качестве токена канала-носителя в заголовке авторизации в запросе HTTPS на промежуточный уровень.

Затем средний уровень пытается получить токен OBO, вызывая AAD со следующими свойствами:

const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
const assertion = userAccessToken;
const scope = "https://graph.microsoft.com/Calendars.Read " +
    "https://graph.microsoft.com/Calendars.Read.Shared " +
    "https://graph.microsoft.com/Calendars.ReadWrite " +
    "https://graph.microsoft.com/Calendars.ReadWrite.Shared " +
    "openid profile email offline_access";
const requestedTokenUse = "on_behalf_of";

У него также есть секретный ключ клиента, который он передает, который определен в регистрации AAD для промежуточного уровня. Когда этот запрос передается конечной точке AAD для получения токена OBO, он всегда завершается ошибкой:

{"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID '<ID of middle-tier application>' named '<name of middle-tier application>'. Send an interactive authorization request for this user and resource.\r\nTrace ID: 39d9bace-03f0-402b-9310-c713aa990200\r\nCorrelation ID: edfbb88f-5c63-4cef-84c1-0de8457852b7\r\nTimestamp: 2019-05-22 22:25:24Z","error_codes":[65001],"timestamp":"2019-05-22 22:25:24Z","trace_id":"39d9bace-03f0-402b-9310-c713aa990200","correlation_id":"edfbb88f-5c63-4cef-84c1-0de8457852b7","suberror":"consent_required"}

Я вижу, что требуется согласие и как я должен отправить интерактивный запрос на авторизацию, но я не уверен, как это сделать. На самом деле, я думал, что делал это, когда сначала вызывал acquTokenPopup (а не acquTokenSilent).

Если вызов acquTokenPopup в клиенте SPA с определенной областью среднего уровня не является правильным способом отправки интерактивного запроса на авторизацию, что это такое?

Возможно, полезная информация:

  • Идентификатор моего клиентского приложения SPA указывается как в разделе «Авторизованные клиентские приложения» портала регистрации AAD для промежуточного уровня, так и в разделе «knownClientApplications» манифеста.

Спасибо!

1 Ответ

2 голосов
/ 23 мая 2019

Во-первых, вы хорошо используете поток On-Behalf-Of для описываемого вами сценария.

Для части согласия администратора (чтобы избежать ошибки AADSTS65001) вы можете попытаться получить согласие явно, в одном издвумя способами:

  • Использование портала Azure (хорошо подходит для приложений с одним арендатором)

    Перейдите на портал Azure> Azure AD> Регистрация приложений> Регистрация для вашего приложения> Разрешения API enter image description here и затем нажмите кнопку «Предоставить согласие администратора для [вашего AD]».

    enter image description here

  • Использовать конечную точку согласия администратора (работает для приложений с одним или несколькими арендаторами)

    Подробнее о документах Microsoft здесь - Запрос разрешенийиз каталога администратора

    GET https://login.microsoftonline.com/{tenant}/adminconsent?
    client_id=6731de76-14a6-49ae-97bc-6eba6914391e
    &state=12345
    &redirect_uri=http://localhost/myapp/permissions
    

    Единственным обязательным параметром здесь является client_id.Вы можете пропустить предоставление других параметров, и согласие все равно должно работать.

В примечании, часть, о которой вы упомянули о knownClientApplications, может помочь в более сложном сценарии, где выпытаясь получить согласие более чем на одну заявку в одном взаимодействии.Как несколько слоев одного и того же логического приложения.Если это то, чего вы пытаетесь достичь, то вам не нужно отдельно соглашаться на API среднего уровня.В этом случае вы все еще могли бы использовать подход 2 для конечной точки согласия администратора.

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