我有一种情况,我有一个RP,不明确要求您登录到它。然而,我看了一下Open ID Connect的会话管理规范,更具体地说,是这里起草的check_session_iframe
端点规范
我想知道下面的场景是否可能。我有一个RP,它使用客户端x联合登录到我的OP上。是否有可能这样,即使您没有会话id(或sid
),我也可以看到客户端(x)是否已登录到OP。换句话说,应用程序是否有可能看到您是否与OP有会话,这样您就不会被迫提示针对OP的登录。
出于用户体验的考虑,我想要满足的一个基本流程是
1)去RP
2)检查RP是否与op有会话。
3) -如果有一个会话,然后自动登录(不启动流)
- 如果没有会话,那么不做任何事情(即不需要提示登录)。
这样的事情可能吗?我确实理解,如果您以前已经登录(通过使用给定的session_state
和client_id
),则有可能获得会话信息
我看过IdentityServer3。样本,更具体地说,是展示如何检查会话状态的客户端样本,但这个样本似乎显示了如何在登录后检查会话状态。我想知道是否有可能检查客户端当前是否有会话,甚至在RP显式请求登录之前。
是的,在OP的授权请求中使用prompt=none
,并在iframe中进行。oidc-client-js库现在支持最近的querySessionStatus
API: https://brockallen.com/2016/08/12/check-session-support-in-oidc-client-js/.
您可以使用querySessionStatus方法来检查是否存在活动会话
我在oidc-client服务中添加了一个方法
sessionStatus(): Promise<any> {
return this._userManager.querySessionStatus();
}
和我调用这个方法来检查是否有一个有效的会话在我的CanActivate保护,如果会话存在,我调用signinRedirect直接不提示登录视图
canActivate(): boolean {
if (!this.authService.isLoggedIn()) {
this.authService.getSessionStatus().then((data) => {
if (data.sid !== null) { // if session exist i call login method in my oidc-client service
this.authService.login();
return true;
} else {
this.router.navigate(['account/login']);
return false;
}
}).catch((err) => {
this.router.navigate(['account/login']);
return false;
});
} else {
return true;
}
}