【问题标题】:How should handle users logout use case when multiple browser tabs are opened打开多个浏览器选项卡时应如何处理用户注销用例
【发布时间】:2018-08-01 06:44:12
【问题描述】:

我将 angular-oauth2-oidc 与 Identity Server 4 一起使用。

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

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

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

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

有什么建议吗?谢谢

【问题讨论】:

    标签: identityserver4 angular-oauth2-oidc


    【解决方案1】:

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

    我已经创建了a dedicated playground example repo,非常适合测试它。我发现有两种截然不同的场景:

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

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

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

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

    场景 1:在第三个​​标签中明确注销

    场景 2:退出应用

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


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

    【讨论】:

      【解决方案2】:

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

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

      效果很好,没有任何网络开销,并且让您可以完全控制在检测到条件时执行的操作。

      【讨论】:

      • 我认为尽管事件 OP 提到 (session_terminated) 实际上是图书馆对该规范的实现。如果您直接在服务器上注销,它确实有效。问题(我认为)是库将在将您发送到注销 uri 时清除 localStorage/sessionStorage 和计时器等等,然后其他选项卡中的会话检查停止工作。问题是(我认为)如何用angular-oath2-oidc 解决这个问题。但 OP 可能会纠正我。
      • 在这种情况下,用户打开两个选项卡并从其中一个选项卡注销 (this.oauthService.logout())。
      • 谢谢你们。根据您的评论,我进行了更多调查。这是我的用例:用户打开两个选项卡(TabA 和 TabB),并从其中一个 TabA 注销。(使用 angular-oath2-oidc 库提供的 this.oauthService.logout())然后,TabB 将获得 session_terminated事件,我要求用户从 TabB 登录。基本上,如果会话终止,我只是为用户提供了重新登录的登录页面链接。此外,session_error 和清理的本地存储事件可能需要按照@Jeroen 的建议进行处理和建议
      【解决方案3】:

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

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

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

      accroding gist

      【讨论】:

        猜你喜欢
        • 2014-03-08
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 2014-10-12
        • 2021-07-28
        相关资源
        最近更新 更多