首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Angular中使用IdentityServer4 + oidc-client-js在空闲时注销用户

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

Stack Overflow用户
提问于 2019-08-22 18:22:38
回答 1查看 3.1K关注 0票数 2

在我的应用程序上,我有一个超时功能,因此当用户空闲X分钟时,我想从Identity Server注销。

我的第一个尝试是手动创建调用,而不需要用户导航到Logout控制器。

此代码如下所示(Angular + TS):

代码语言:javascript
复制
      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库中的常规signout函数运行良好。

代码语言:javascript
复制
    this.userManager
      .signoutRedirect()
      .then(res => {
        if (!environment.production) {
          // console.log('Redirection to signout triggered.', res);
        }
      })

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

这个函数接受一个post_logout_redirect_uri和一个state作为参数,但是我还没能成功地在我的IdentityServer上获取它们(我仍然是.Net的新手)。

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

感谢您的意见

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-22 20:56:59

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

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

在用户注销后,使用post_logout_redirect_uri将用户带回应用程序中的某个位置确实是正确的选择。这些URI必须针对客户端进行预注册。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57607178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档