Выйти из системы при простое с помощью IdentityServer4 + oidc-client-js в Angular

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

Моя первая попытка заключалась в том, чтобы вручную создать вызов без перехода пользователя к контроллеру выхода из системы.

Этот код выглядит так (Angular + TS):


      this.userManager
        .createSignoutRequest({ id_token_hint: this.user && this.user.id_token })
        .then(signout_request => {

          this.http
            .get(signout_request.url, {
              responseType: 'text',
              headers: new HttpHeaders().set(InterceptorSkipHeader, '') // Ignores token http-interceptor
            })
            .subscribe(_ => {
              this.userManager.removeUser().then(_ => {
                window.location.href = '/timeout'; // Navigate to page that informs user has been timed out
              });
            });
        });

Я вижу, что он переходит к конечной точке конечной сессии с id_token_hint и правильным redirect_url, однако, когда я пытаюсь снова войти в приложение, он дает мне токен, не запрашивая снова учетные данные, что противоречит его цели.

Обычная функция выхода из библиотеки oidc-client-js работает нормально.


    this.userManager
      .signoutRedirect()
      .then(res => {
        if (!environment.production) {
          // console.log('Redirection to signout triggered.', res);
        }
      })

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

Эта функция принимает в качестве параметра post_logout_redirect_uri и state, но мне не удалось получить их на моем IdentityServer (я все еще новичок в .Net).

Это неправильный подход? Должен ли я вернуть пользователя в мое приложение Angular, используя что-то вроде маршрута / timeout, чтобы показать это сообщение?

Спасибо за ваш вклад


person Narshe    schedule 22.08.2019    source источник


Ответы (1)


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

Лучшим вариантом может быть использование параметра конечной точки max_age авторизации в запросе на вход и проверка auth_time в результирующем id_token, чтобы убедиться, что он не старше, чем вы хотите. Таким образом, вы получите новый токен только в том случае, если они аутентифицированы в течение указанного вами периода времени, но вам не нужно беспокоиться о явном выходе пользователя из системы.

post_logout_redirect_uri - это действительно то, что нужно использовать, чтобы вернуть пользователя куда-нибудь в ваше приложение после выхода из системы. Эти URI должны быть предварительно зарегистрированы для клиента.

person mackie    schedule 22.08.2019
comment
Спасибо за вклад. У меня есть вопрос, если вы можете уточнить: в этом случае, если я также использую автоматическое обновление, буду ли я получать новое время при каждом обновлении? Или это сработает, скажем, только для того, чтобы пользователь мог использовать токен только в течение 1 дня или 8 часов или тому подобное. - person Narshe; 22.08.2019
comment
Если вы используете автоматическое обновление (prompt=none) в сочетании с max_age=n, тогда, если возраст будет превышен, вы получите error=login_required в ответ и должны будете запрашивать интерактивную аутентификацию, которая, в свою очередь, обновит auth_time до now() - person mackie; 22.08.2019
comment
Спасибо, попробую. Хотя это не отвечает на мой первоначальный вопрос, я считаю, что это действительно решает проблему. Еще раз спасибо за ваше время. - person Narshe; 22.08.2019