Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端

Posted

技术标签:

【中文标题】Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端【英文标题】:Identity Server 4 - Check iframe session issue - oidc client 【发布时间】:2019-02-15 01:21:53 【问题描述】:

我在我的 Angular 应用程序中使用 OIDC Client 对身份服务器 4 进行身份验证。一切正常,直到我点击退出。

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

【问题讨论】:

您配置或使用的授权流程是什么?您是否配置了注销 URL? 我正在使用隐式流。注销 URL 已正确设置。当我从一个选项卡注销时,另一个选项卡正在检测并调用silent_refresh.html,它说需要登录。这可以。但是我在用户管理器上注册的事件没有触发。我已经注册了 userUnloaded 和 UserSignedOut 事件。但那些没有开火。 我会建议你为什么在点击注销按钮时不使用 OIDC signoutRedirect(),然后调用 clearStaleState()。而不是触发事件。如果有的话,还要检查 iframe 的错误吗?按照建议粘贴代码。 【参考方案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);
       );
 );

查看documentation了解更多详情

【讨论】:

我认为问题与令牌过期无关,然后进行静默刷新,似乎有一些陈旧状态或使用 singOutRedirect 触发注销。 是的,但是静默刷新请求是检查会话是否仍然有效或与身份服务器无效的一种方式 @FatehMohamed,我尝试注册此事件,但未引发该事件。 查看我的更新;我有身份服务器和 oidc 客户端,单点注销非常适合我,使用 addUserSignedOut 事件 @FatehMohamed,是的,我在我的一个示例应用程序中也得到了它。但是在我的其他项目中仍然没有触发注销事件。日志中没有错误。有什么解决方法吗?

以上是关于Identity Server 4 - 检查 iframe 会话问题 - oidc 客户端的主要内容,如果未能解决你的问题,请参考以下文章

text Identity Server 4 - .netcore 2

使用 Identity Server 4 和 ASP.NET Identity 添加外部登录

使用Identity Server 4建立Authorization Server

使用Identity Server 4建立Authorization Server

使用Identity Server 4建立Authorization Server

视频Identity Server 4 - 02. OAuth 2.0 简介(下)