我正在使用angular-oauth2-oidc与Identity Server 4 .
用户需要通过OpenId Connect Implicit Flow登录 . 我的Id和Access令牌存储在Web浏览器localStorage中 .
当用户打开多个浏览器选项卡,然后用户从其中一个选项卡注销时,我应该如何处理其余选项卡?
我试图捕获session_terminated事件,并尝试将用户注销 . 但是,它不会将用户重定向回登录页面 .
this.oauthService.events.filter(e => e.type ==='session_terminated')
.subscribe(e => {this.oauthService.logout();})
有什么建议?谢谢
2 回答
有趣 . 这是我的待办事项列表,看看它是如何与图书馆一起工作的 .
我已经创建了a dedicated playground example repo,非常适合测试它 . 我发现有两个不同的场景:
用户自己转到IdentityServer,然后单击“注销”
用户通过我们自己的应用程序进行单点注销
仅在第一个场景中,您才会收到
session_terminated
事件 . 在第二个场景(您似乎有)中,您会在第二个选项卡中收到session_error
事件,因为第一个选项卡:清除存储的令牌
将您重定向到注销页面(您仍然需要单击注销)
您可以在这些屏幕截图中看到尽可能多的内容:
Scenario 1: log out explicitly in a third tab
Scenario 2: log out from the app
所以我认为你的解决方案也是挂钩
session_error
,或类似的东西 .脚注:考虑更多关于上述内容,我认为通过监听
localStorage
事件也可能有其他变通方法,并注意access_token
被另一个标签清除 .这就是OIDC会话管理规范的全部内容 . 当IDP会话更改/结束时,您可以在客户端通知您,然后做出相应的反应 .
http://openid.net/specs/openid-connect-session-1_0.html#ChangeNotification
运行良好,没有任何网络开销,让您完全控制检测到条件时要执行的操作 .