在我的应用程序上,我有一个超时功能,因此当用户空闲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库中的常规signout函数运行良好。
this.userManager
.signoutRedirect()
.then(res => {
if (!environment.production) {
// console.log('Redirection to signout triggered.', res);
}
})唯一的警告是,我想向用户提供额外的信息,说明他们由于不活动而超时,我不确定是如何做到的。
这个函数接受一个post_logout_redirect_uri和一个state作为参数,但是我还没能成功地在我的IdentityServer上获取它们(我仍然是.Net的新手)。
这是错误的方法吗?我应该使用类似于/timeout路由的方式将用户导航回我的Angular应用程序来显示此消息吗?
感谢您的意见
发布于 2019-08-22 20:56:59
AFAIK不支持以这种方式调用end session端点-它必须是顶级导航,因为它可能涉及到呈现UI。当执行这样的CORS请求时,不会发送cookie。
更好的选择可能是在登录请求中使用max_age authorize端点参数,并在生成的id_token中检查auth_time,以确保它不会比您想要的旧。这样,如果令牌在您提供的时间段内通过身份验证,您将只获得一个新令牌,但您不必担心显式地注销用户。
在用户注销后,使用post_logout_redirect_uri将用户带回应用程序中的某个位置确实是正确的选择。这些URI必须针对客户端进行预注册。
https://stackoverflow.com/questions/57607178
复制相似问题