1

我们有多个客户端使用response_type:code(PKCE 的授权代码流)与身份服务器 4 通信以登录用户。

客户端在angular框架中,使用angular-oauth-oidc库并localstorage用作存储。

现在,当用户登录客户端 1 并在同一浏览器中打开客户端 2 时,他/她会自动登录(或者至少在登录/结束会话期间存在一些干扰)。在我们的例子中,这不是可取的行为。我们希望我们的所有 3 个客户端应用程序(具有 3 个客户端 ID)的行为完全独立。

是否可以在客户端或我们的identityserver4后端设置配置以使用户在所有三个客户端上独立登录?

选项 1:在客户端中使用会话存储而不是本地存储。这也是不可取的,因为我们希望用户即使在关闭窗口后也能够保持登录状态。

选项 2:设置 prompt=login 似乎可以解决问题,但不确定这是否是正确的方法。对此有何见解?

有没有标准/正确的方法来实现这一目标?

4

1 回答 1

0

在前端,您只能解决这个挑战的一部分。正如您所指出的,您需要确保您的应用程序的每个实例都是完全隔离的,或者至少实现一个自定义AuthStorage,例如在所有键前面加上 client_id,例如:

export class ClientBasedOAuthStorage implements OAuthStorage {
  private scope: string = "default";

  constructor() {
    this.scope = environment.oauthOptions.scope; // or some such
  }
  
  getItem(key: string): string {
    return localStorage.getItem(`${this.scope}_${key}`);
  }
  
  removeItem(key: string): void {
    localStorage.removeItem(`${this.scope}_${key}`);
  }

  setItem(key:string, data: string): void {
    localStorage.setItem(`${this.scope}_${key}`, data);
  }
}

如果您使用sessionStorage或其他一些独立的存储,那么您已经可以使用了。

现在,在服务器端,我认为大多数事情都会“正常工作”。对 IdentityServer4 实例的所有请求都将提供一个client_id并且应该已经被正确地限定了范围。唯一可能给您带来麻烦的是 IDS4 的“记住我”cookie,但 csharp 方面有很多拦截点,您也可以注入来控制该行为。

于 2021-11-20T17:25:10.530 回答