闲置时使用Angular中的IdentityServer4 + oidc-client-js注销用户

时间:2019-08-22 10:22:38

标签: angular identityserver4 oidc-client-js

在我的应用程序上,我具有超时功能,因此当用户闲置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到达了endsession端点,但是当我尝试重新登录到应用程序时,它为我提供了一个令牌,而无需再次要求我提供凭据,这不符合其目的。

oidc-client-js库中的常规签出功能可以正常工作。


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

唯一的警告是,我想向用户提供其他信息,说明他们由于不活动而超时,我不确定如何。

此函数接受post_logout_redirect_uristate作为参数,但是我无法成功将它们保存在IdentityServer上(我仍然是.Net的新手)。

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

感谢您的输入

1 个答案:

答案 0 :(得分:1)

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

更好的选择可能是在登录请求中使用max_age授权端点参数,并在结果auth_time中检查id_token,以确保它不早于您想要的年龄。这样,只有在您提供的时间段内对新令牌进行了身份验证后,您才能获得一个新令牌,而不必担心显式注销用户。

post_logout_redirect_uri确实是在注销后将用户带回应用程序内某个位置的正确方法。这些URI必须在客户端上预先注册。