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

Я использую angular-oauth2-oidc с Identity Server 4.

Пользователям необходимо войти через OpenId Connect Implicit Flow. Мой идентификатор и токен доступа хранятся в веб-браузере localStorage.

Когда пользователь открывает несколько вкладок браузера, а затем выходит из одной из вкладок, как мне обрабатывать остальные вкладки?

Я попытался перехватить события session_terminated, и они пытаются выйти из системы. Однако он не перенаправляет пользователя обратно на страницу входа.

this.oauthService.events.filter(e => e.type ==='session_terminated')
                  .subscribe(e => {this.oauthService.logout();})

какие-либо предложения? Спасибо

4 ответа

Интересно. Это было в моем списке дел, чтобы посмотреть, как это работает с библиотекой в ​​любом случае.

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

  1. Пользователь заходит на IdentityServer и нажимает кнопку "Выйти".
  2. Пользователь делает единый выход через наше собственное приложение

Только в первом сценарии вы получаете session_terminated событие. Во втором сценарии (который у вас, кажется, есть) вы получаете session_error событие во второй вкладке, потому что первая вкладка:

  1. Очищает ваши сохраненные токены
  2. Перенаправляет вас на страницу выхода (где вы все еще должны нажать кнопку выхода)

Вы можете увидеть столько же в этих скриншотах:

Сценарий 1: явный выход из системы на третьей вкладке

из-сервера

Сценарий 2: выйти из приложения

перенаправление

Поэтому я думаю, что ваше решение также заключается в session_errorили что-то подобное.


Сноска: подумав немного о вышесказанном, я считаю, что другие обходные пути также могут быть возможны при прослушивании localStorage события, и обратите внимание, когда access_token очищается другой вкладкой.

У меня возникла похожая проблема: использование angular-oauth2-oidc с хранилищем по умолчанию (sessionStorage) приводит к тому, что если пользователь открывает новую вкладку (вкладка B), он снова входит в систему с новым токеном. Когда он выходит из системы на вкладке A, токен, сохраненный в sessionStorage вкладки B, конечно же, все еще там.

Недостатком использования localStorage является то, что токен сохраняется, даже если браузер закрыт (вроде "держите меня в системе").

Чтобы преодолеть это, я использовал собственный OAuthStorage, который внутренне использует sessionStorage, но если пользователь выходит из системы, он отправляет событие на все другие открытые вкладки браузера и запускает очистку там хранилищ сессии.

Смотрите суть

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

http://openid.net/specs/openid-connect-session-1_0.html

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

Вы можете проверить, недействителен ли access_token в localstorage или sessionStorage.

Другие вопросы по тегам