6

我在Identity Server 4 中使用angular-oauth2-oidc 。

用户需要通过 OpenId Connect Implicit Flow 登录。我的 ID 和访问令牌存储在 Web 浏览器 localStorage 中。

当用户打开多个浏览器选项卡然后用户从其中一个选项卡中注销时,我应该如何处理其余选项卡?

我试图捕捉 session_terminated events ,他们试图注销用户。但是,它不会将用户重定向回登录页面。

this.oauthService.events.filter(e => e.type ==='session_terminated')
                  .subscribe(e => {this.oauthService.logout();})

有什么建议么?谢谢

4

3 回答 3

2

有趣的。它在我的待办事项清单上,看看它如何与图书馆一起工作。

我已经创建了一个专门的游乐场示例存储库,非常适合测试它。我发现有两种不同的情况:

  1. 用户自己去IdentityServer,然后点击注销
  2. 用户通过我们自己的应用程序进行单点注销

只有在第一种情况下,你才会得到一个session_terminated事件。在第二种情况下(您似乎有),您会session_error在第二个选项卡中获得一个事件,因为第一个选项卡:

  1. 清除您存储的令牌
  2. 将您重定向到注销页面(您仍然必须单击注销)

您可以在这些屏幕截图中看到尽可能多的内容:

场景 1:在第三个选项卡中显式注销

从服务器

场景 2:从应用程序中注销

重定向

所以我认为你的解决方案是也挂钩session_error,或类似的东西。


脚注:对上述内容进行更多思考,我认为其他解决方法也可能通过侦听localStorage事件来实现,并注意何时access_token被另一个选项卡清除。

于 2018-08-01T10:00:42.900 回答
1

这就是 OIDC 会话管理规范的全部内容。当他们的 IDP 会话更改/结束时,您可以在客户端收到通知,然后做出相应的反应。

http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification

运行良好,没有任何网络开销,让您完全控制检测到条件时的操作。

于 2018-08-01T13:38:25.110 回答
1

我遇到过类似的问题:使用angular-oauth2-oidc默认存储 (sessionStorage) 会导致如果用户打开新选项卡 (Tab B),他将使用新令牌再次登录。当他在选项卡 A 上注销时,存储在选项卡 B 的 sessionStorage 中的令牌当然仍然存在。

使用 localStorage 的缺点是,即使浏览器关闭(有点“让我登录”),令牌也会保留。

我为克服这个问题所做的是使用自己的 OAuthStorage,该 OAuthStorage 在内部使用 sessionStorage,但如果用户注销,它会向所有其他打开的浏览器选项卡发送一个事件并触发清除那里的会话存储。

请参阅渐进要点

于 2019-04-25T08:13:00.920 回答