Oauth 2.0 |СПА |Как id_token маскируется под access_token для доступа к ограниченным веб-ресурсам? - PullRequest
2 голосов
/ 24 апреля 2019

Я работаю над интеграцией Azure Active Directory для моего приложения Angular SPA ( или любого Javascript ). Приложение имеет интерфейс (, созданный с использованием JavaScript ) и веб-API (, созданный с использованием любого c # или любых серверных языков ).

Для справки https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp

Я знаю, что я настроил неявное предоставление OAuth 2.0 в SPA AAD Registration. OAuth 2.0 Implicit Grant слегка смягчен, чтобы позволить SPA получить доступ к веб-ресурсам, связанным с регистрацией SPA AAD, выкупая 'id_token'.

Протокол неявного предоставления OAuth 2.0:

  1. Достигните конечной точки аутентификации Azure с помощью client_id, resource, .. для id_token
  2. Испытайте его с учетными данными
  3. Получить id_token, как он отправлен обратно в URI SPA.
  4. Используйте id_token в качестве токена-носителя для доступа к ограниченным веб-ресурсам.

SPA очень хорошо работает только с id_token и протоколом неявного предоставления OAuth 2.0 для внутреннего веб-API.

Причина, по которой мы не смогли получить access_token от SPA или JS:

SPA не удалось отправить XHR в конечную точку токена Azure, так как SPA заблокирован политикой CORS конечной точки токена Azure. Таким образом, SPA XHR не смог получить access_token.

Но реализация Adal.js в iFrames может получить access_token путем вызова междоменных веб-ресурсов.

Похоже, это особый случай только для SPA.

ВОПРОСЫ:

  1. Как AAD определяет, к каким веб-ресурсам может обращаться владелец id_token? Поиск веб-ресурсов, связанных с регистрацией SPA AAD?

    [OP] Adal.js отвечает за перехват наших постбэков для получения и хранения токенов, таких как id_token & access_token

  2. Не может ли AAD реализовать следующий подход?

    • Перенаправить в конечную точку аутентификации Azure с помощью client_id, resource, .. для кода авторизации.
    • Получите код авторизации из конечной точки проверки подлинности Azure, отправив его обратно в URI SPA.
    • Вместо XHR в конечную точку токена Azure мы не можем перенаправить в конечную точку токена Azure с Auth_Code, client_id, resource, .., чтобы позволить конечной точке токена Azure отправить обратно access_token обратно в redirect_uri?

    [OP] У Adal.js были другие планы использовать iFrames для вызова междоменного API ( Конечная точка аутентификации Az, в данном случае ) и получения токенов доступа.

P.S. Мне нужны реальные ответы на вышеуказанные вопросы. Этот случай сейчас раскрыт:)!

1 Ответ

2 голосов
/ 24 апреля 2019

Как AAD определяет, к каким веб-ресурсам может обращаться владелец id_token?Поиск веб-ресурсов, связанных с регистрацией SPA AAD?

Это не так.Если ваш API настроен на прием допустимых токенов AAD с аудиторией, настроенной на идентификатор клиента вашего клиентского приложения, он примет этот токен.Тем не менее, это не очень хорошая модель, вы должны использовать токены доступа для вызова API.

Что касается вашего вопроса относительно токенов доступа, клиентский интерфейс может получить токены доступа через неявный поток с помощью перенаправления или скрытогоIFrame.Если вы используете ADAL.js или MSAL.js, они делают это автоматически, если вы запрашиваете у них токен доступа.

По сути, они открывают iframe, который отправляется на конечную точку / authorize с помощью:

  • response_type=token
  • resource=https%3A%2F%2Fgraph.microsoft.com или scope=https%3A%2F%2Fgraph.microsoft.com%2FUser.Read при использовании v2 / MSAL
  • prompt=none

Последний параметр сообщает AADне делать подсказки (это скрытый iframe).Если в браузере пользователя все еще существует действительный сеанс и было предоставлено согласие для запрашиваемых областей, токен возвращается в качестве перенаправления на ваш SPA в рамках iframe.Затем ADAL / MSAL могут извлечь токен из URL-адреса iframe, поскольку они работают на одном и том же имени хоста.

Из-за того, как это работает, вы захотите проверить, находитесь ли вы в iframe, когда ваш SPAзагружает и не отображает приложение вообще, если оно есть.

И нет, вы не можете вызвать конечную точку / token из интерфейса JS.

...