检查会话Iframe OpenIDConnect



我有一种情况,我有一个RP,不明确要求您登录到它。然而,我看了一下Open ID Connect的会话管理规范,更具体地说,是这里起草的check_session_iframe端点规范

我想知道下面的场景是否可能。我有一个RP,它使用客户端x联合登录到我的OP上。是否有可能这样,即使您没有会话id(或sid),我也可以看到客户端(x)是否已登录到OP。换句话说,应用程序是否有可能看到您是否与OP有会话,这样您就不会被迫提示针对OP的登录。

出于用户体验的考虑,我想要满足的一个基本流程是

1)去RP

2)检查RP是否与op有会话。

3) -如果有一个会话,然后自动登录(不启动流)

  • 如果没有会话,那么不做任何事情(即不需要提示登录)。

这样的事情可能吗?我确实理解,如果您以前已经登录(通过使用给定的session_stateclient_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;
  }
 }

最新更新