5

我有一个没有明确要求您登录的 RP。但是,我查看了 Open ID Connect 的会话管理规范,更具体地说是此处check_session_iframe起草的端点规范

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

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

1)去RP。

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

3) - 如果有会话则自动登录(不启动流程)

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

这样的事情可能吗?session_state我确实了解,如果您之前已登录(通过使用给定的and client_id),则可以获得会话信息

我查看了IdentityServer3.Samples,更具体地说是显示如何在此处检查会话状态的客户端示例,但是似乎此示例显示了如何在登录后检查会话状态。我想知道它是否即使在 RP 明确请求登录之前,也可以检查客户端当前是否有会话。

4

2 回答 2

3

是的,prompt=none在对 OP 的授权请求中使用,并在 iframe 中进行。oidc-client-js 库现在支持querySessionStatus最近的 API:https ://brockallen.com/2016/08/12/check-session-support-in-oidc-client-js/ 。

于 2016-08-16T22:12:16.247 回答
0

您可以使用querySessionStatus方法来检查是否有活动会话

我在我的 oidc 客户端服务中添加了一个方法

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;
  }
 }
于 2018-10-30T22:14:07.880 回答