打开多个浏览器标签时如何处理用户注销用例

时间:2018-08-01 06:44:13

标签: identityserver4 angular-oauth2-oidc

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

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

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

我尝试捕获session_terminated事件,并且它们尝试注销用户。但是,它不会将用户重定向回登录页面。

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

有什么建议吗?谢谢

3 个答案:

答案 0 :(得分:1)

有趣。在我的待办事项清单上可以看到它如何与库一起工作。

我已经创建了a dedicated playground example repo,非常适合测试。我发现存在两种不同的情况:

  1. 用户自己转到IdentityServer,然后单击注销
  2. 用户通过我们自己的应用进行单次退出

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

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

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

方案1:在第三标签

中明确注销

from-server

方案2:从应用中退出

redirection

因此,我认为您的解决方案是也加入session_error或类似的内容。


脚注:我对上述内容有更多的思考,我认为通过监听localStorage事件,并注意access_token被另一个选项卡清除的时间,其他解决方法也是可能的。

答案 1 :(得分:0)

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

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

效果很好,没有任何网络开销,可以让您完全控制检测到该状况时的操作。

答案 2 :(得分:0)

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

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

我为克服此问题所做的工作是使用内部使用sessionStorage的自己的OAuthStorage,但如果用户注销,它将向所有其他打开的Browser-Tab发送事件,并触发在那里清除会话存储。

请参见accroding gist