3

我在我的角度应用程序中使用OIDC 客户端对身份服务器 4 进行身份验证。一切正常,直到我退出。

我启用了监视会话(默认启用),以便其他浏览器可以检测到注销,并且我可以在同一浏览器的其他选项卡中注销用户。当我从一个选项卡中注销时,另一个选项卡会向身份服务器发出请求以获取静默刷新令牌,并获得成功。我希望其他浏览器也能注销。如果我在另一个选项卡中按 F5,那么是的,它会被重定向到再次登录。但不是自动的。

4

1 回答 1

1

更新

要从共享相同身份服务器frontChannel 的其他客户端注销,您可以在您的身份中添加一个 iframe 以通知您的客户端有关注销(oidc-client.js 支持前端通道注销

前通道服务器端客户端

要通过前端通道规范从服务器端客户端应用程序中注销用户,IdentityServer 中的“注销”页面必须呈现一个通知客户端用户已注销。希望收到通知的客户端必须设置 FrontChannelLogoutUri 配置值。IdentityServer 跟踪用户已登录的客户端,并在 IIdentityServerInteractionService 上提供名为 GetLogoutContextAsync 的 API(详细信息)。此 API 返回带有 SignOutIFrameUrl 属性的 LogoutRequest 对象,您的注销页面必须将其呈现为 .

反向通道服务器端客户端

要通过反向通道规范从服务器端客户端应用程序注销用户,IdentityServer 中的 SignOutIFrameUrl 端点将自动触发服务器到服务器调用,将签名的注销请求传递给客户端。这意味着即使没有前端通道客户端,IdentityServer 中的“注销”页面仍必须如上所述向 SignOutIFrameUrl 呈现一个。希望收到通知的客户端必须设置 BackChannelLogoutUri 配置值。

基于浏览器的 JavaScript 客户端

鉴于会话管理规范是如何设计的,您需要在 IdentityServer 中执行任何特殊操作来通知这些客户端用户已注销。但是,客户端必须对 check_session_iframe 执行监控,这由 oidc-client JavaScript 库实现。

之后,您可以在所有客户端中侦听 oidc-client 的 addUserSignedOut 事件触发signoutRedirect以注销您的客户端

this._userManager.events.addUserSignedOut(() => {
    this._userManager
      .signoutRedirect()
       .then(resp => {
         console.log('Success');
       })
       .catch(err => {
         console.log(err);
       });
 });

查看此文档以获取更多详细信息

于 2018-09-12T14:39:16.513 回答