在 Angular 中使用 IdentityServer4 + oidc-client-js 在空闲时注销用户
Log out user when idle using IdentityServer4 + oidc-client-js in Angular
在我的应用程序中,我有一个超时功能,所以当用户空闲 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 进入结束会话端点,但是当我尝试重新登录到应用程序时,它给了我一个令牌而不要求我再次违背其目的的凭据。
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 应用程序以显示此消息?
感谢您的输入
AFAIK 不支持以这种方式调用结束会话端点 - 它必须是顶级导航,因为它可能涉及呈现 UI。执行这样的 CORS 请求时不会发送任何 cookie。
更好的选择可能是在登录请求中使用 max_age
授权端点参数,并在结果 id_token
中检查 auth_time
以确保它不比您想要的旧。这样,如果他们在您提供的时间段内通过身份验证,您只会获得一个新令牌,但您不必担心显式注销用户。
post_logout_redirect_uri
确实是正确的做法,可以在用户注销后将其带回您应用中的某个地方。这些 URI 必须针对客户端进行预注册。
在我的应用程序中,我有一个超时功能,所以当用户空闲 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 进入结束会话端点,但是当我尝试重新登录到应用程序时,它给了我一个令牌而不要求我再次违背其目的的凭据。
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 应用程序以显示此消息?
感谢您的输入
AFAIK 不支持以这种方式调用结束会话端点 - 它必须是顶级导航,因为它可能涉及呈现 UI。执行这样的 CORS 请求时不会发送任何 cookie。
更好的选择可能是在登录请求中使用 max_age
授权端点参数,并在结果 id_token
中检查 auth_time
以确保它不比您想要的旧。这样,如果他们在您提供的时间段内通过身份验证,您只会获得一个新令牌,但您不必担心显式注销用户。
post_logout_redirect_uri
确实是正确的做法,可以在用户注销后将其带回您应用中的某个地方。这些 URI 必须针对客户端进行预注册。