在我的应用程序上,我具有超时功能,因此当用户闲置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_uri
和state
作为参数,但是我无法成功将它们保存在IdentityServer上(我仍然是.Net的新手)。
这是错误的方法吗?我是否可以使用/ timeout路由之类的方法将用户导航回我的Angular应用程序以显示此消息?
感谢您的输入
答案 0 :(得分:1)
不支持以这种方式调用结束会话终结点AFAIK-它必须是顶级导航,因为它可能涉及呈现UI。像这样进行CORS请求时,不会发送Cookie。
更好的选择可能是在登录请求中使用max_age
授权端点参数,并在结果auth_time
中检查id_token
,以确保它不早于您想要的年龄。这样,只有在您提供的时间段内对新令牌进行了身份验证后,您才能获得一个新令牌,而不必担心显式注销用户。
post_logout_redirect_uri
确实是在注销后将用户带回应用程序内某个位置的正确方法。这些URI必须在客户端上预先注册。