OpenId Connect обновляет access_token в SPA - PullRequest
0 голосов
/ 29 мая 2018

Попытка реализовать OpenId Connect в веб-приложении, состоящем из следующих компонентов

  • Поставщик удостоверений
  • Сервер ресурсов
  • Одностраничное приложение, действующее в качестве клиента.

Identity Provider и Resource Server - это одно и то же приложение.

SPA использует поток паролей для получения access_token и сохраняет его в файле cookie. Хранение access_token в cookie имеет потоков безопасности , но это другая история.

Проблема

access_token срок действия выданного IdP истекает через 30 минут, и SPA необходимо обновить токен без повторного запроса учетных данных.

Решение

IdP возвращает refresh_token вместе с access_token.Всякий раз, когда SPA получает 401 с сервера ресурсов, он отправляет refresh_token IdP и получает новый access_token назад.

Проблема

Отправка refresh_token в SPA плохая практика .

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

Предлагаемое решение

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

Я думаю, Тихая аутентификация не применима к потоку паролей, когда IdP иРесурс-сервер - это то же приложение.access_token, выданный IdP, является только частью информации, которую можно использовать для авторизации на сервере ресурсов / IdP после истечения срока его действия. Как клиент может убедить IdP выдать новый access_token?(без отправки refresh_token)

Найдена angular-oauth2-oidc библиотека, которая использует refresh_token для обновления access_token.

Каков наилучший метод / решение в этом случае для продления access_token?

технические данные

  • Поставщик удостоверений - ASP.NETБиблиотека Core + Openiddict.
  • SPA - приложение AngularJs.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Использование потока «Учетные данные пароля владельца ресурса» устраняет аргумент хранилища маркера обновления: вместо того, чтобы не иметь возможности хранить токен обновления в безопасном месте, SPA теперь должен будет хранить учетные данные владельца ресурса в безопасном месте (при условии, что выхотите избежать частых запросов имени пользователя / пароля от пользователя).Неявное предоставление было разработано для использования с SPA, поэтому лучше придерживаться этого.

0 голосов
/ 30 мая 2018

Одностраничные приложения не должны получать токены обновления.Это было установлено правилами в OAuth 2.0 и OpenID Connect.

Один хороший вариант, который я вижу здесь, это использовать Implicit Flow .Это установит сеанс прямого канала от вашего браузера до провайдера идентификации.С типом предоставления пароля вы делаете вызов по обратному каналу (POST), поэтому вы не получаете такой сеанс.

Обычно это файл cookie, который указывает на информацию о предыдущем входе в систему (это специфика провайдера идентификации)).После завершения потока SPA получит access token.Как вы уже поняли, срок его действия истечет.Но как только это произойдет, SPA может запустить другой неявный поток, но на этот раз с параметром запроса prompt.

prompt

Разделенный пробелами список с учетом регистраиз строковых значений ASCII, которые указывают, запрашивает ли сервер авторизации конечного пользователя для повторной аутентификации и согласия.Определены следующие значения: нет , логин , согласие и select_account

Если ваш провайдер идентификации поддерживаетдолгоживущий сеанс (например: - несколько часов или дней) или, если он поддерживает cookie-файл «Помни меня», SPA может использовать prompt=none, чтобы пропустить шаг входа в систему от провайдера идентификации.По сути, вы получаете браузерное SSO-поведение с этим.

...