在 Angular 中使用 IdentityServer4 + oidc-client-js 在空闲时注销用户

Log out user when idle using IdentityServer4 + oidc-client-js in 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 的新手)。

这是错误的做法吗?我是否应该使用 /timeout 路由之类的方式将用户导航回我的 Angular 应用程序以显示此消息?

感谢您的输入

AFAIK 不支持以这种方式调用结束会话端点 - 它必须是顶级导航,因为它可能涉及呈现 UI。执行这样的 CORS 请求时不会发送任何 cookie。

更好的选择可能是在登录请求中使用 max_age 授权端点参数,并在结果 id_token 中检查 auth_time 以确保它不比您想要的旧。这样,如果他们在您提供的时间段内通过身份验证,您只会获得一个新令牌,但您不必担心显式注销用户。

post_logout_redirect_uri 确实是正确的做法,可以在用户注销后将其带回您应用中的某个地方。这些 URI 必须针对客户端进行预注册。