2

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

我的第一次尝试是手动创建呼叫,而无需用户导航到 Logout 控制器。

这段代码看起来像这样(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);
        }
      })

唯一需要注意的是,我想向用户提供其他信息,说明他们由于不活动而超时,我不知道怎么做。

此函数接受 apost_logout_redirect_uri和 astate作为参数,但我无法成功地在我的 IdentityServer 上获取它们(我还是 .Net 的新手)。

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

感谢您的输入

4

1 回答 1

1

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

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

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

于 2019-08-22T12:56:59.207 回答