我在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();})
有什么建议吗?谢谢
答案 0 :(得分:1)
有趣。在我的待办事项清单上可以看到它如何与库一起工作。
我已经创建了a dedicated playground example repo,非常适合测试。我发现存在两种不同的情况:
仅在第一种情况下,您会获得session_terminated
事件。在第二种情况下(您似乎拥有),在第二个选项卡中会收到一个session_error
事件,因为第一个选项卡是:
您可以在这些屏幕截图中看到很多内容
方案1:在第三标签
中明确注销方案2:从应用中退出
因此,我认为您的解决方案是也加入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发送事件,并触发在那里清除会话存储。