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

4
我在我的Angular应用程序中使用OIDC客户端进行针对Identity Server 4的身份验证。一切都很顺利,直到我点击退出登录。
我已启用监视会话(默认情况下启用),以便其他浏览器可以检测到退出登录,并且我可以在同一浏览器的其他选项卡中注销用户。当我从一个选项卡退出时,另一个选项卡会向身份服务器发出静默刷新令牌的请求,并且成功获取。我期望其他浏览器也会退出登录。如果我在其他选项卡中按F5,那么是的,它会自动重定向到登录页面,但不是自动的。

你配置或使用了哪种授权流程? 你配置了登出URL吗? - Sohan
我正在使用隐式流程。登出URL已正确设置。当我从一个标签页注销时,另一个标签页会检测并调用silent_refresh.html,并提示需要登录。这很好。但是我在用户管理器上注册的事件没有触发。我已经注册了userUnloaded和UserSignedOut事件,但它们都没有触发。 - Himal Patel
我建议当用户点击注销按钮时,使用OIDC signoutRedirect(),然后调用clearStaleState(),而不是触发事件。另外,检查iframe是否有任何错误?按照建议粘贴代码。 - Sohan
1个回答

1

更新

如果要从共享相同身份服务器的其他客户端注销,您可以在您的身份中添加一个Iframe来通知您的客户端有关注销的信息(oidc-client.js支持前端通道注销)。详情请参见frontChannel

前端服务器端客户端

通过前端通道规范,IdentityServer的“已注销”页面必须呈现一个<iframe>以通知客户端用户已注销,希望得到通知的客户端必须设置FrontChannelLogoutUri配置值。IdentityServer跟踪用户登录的客户端,并在IIdentityServerInteractionService(详情)上提供名为GetLogoutContextAsync的API。此API返回一个LogoutRequest对象,其中包含一个SignOutIFrameUrl属性,您的“已注销”页面必须将其呈现到一个<iframe>中。

后端服务器端客户端

通过后端通道规范,IdentityServer的SignOutIFrameUrl端点将自动触发服务器对服务器调用,传递签名注销请求给客户端。这意味着即使没有前端通道客户端,IdentityServer的“已注销”页面仍必须像上述那样呈现一个<iframe>到SignOutIFrameUrl。希望得到通知的客户端必须设置BackChannelLogoutUri配置值。

基于浏览器的JavaScript客户端

鉴于会话管理规范的设计方式,IdentityServer中无需进行任何特殊操作即可通知这些客户端用户已注销。但是,客户端必须对check_session_iframe进行监视,oidc-client JavaScript库实现了这一点。

之后,您可以在所有客户端上监听oidc-clientaddUserSignedOut事件,并触发signoutRedirect以注销您的客户端。

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

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


我认为问题与令牌过期和静默刷新无关,似乎存在一些陈旧的状态或使用 singOutRedirect 触发了注销。 - Sohan
是的,但是静默刷新请求是一种检查会话是否仍然有效或与身份服务器无关的方法。 - Fateh Mohamed
检查我的更新;我使用了Identity Server和OIDC-Client,单点登出对我来说完美地运作,使用addUserSignedOut事件。 - Fateh Mohamed
@FatehMohamed,是的,我也在我的一个示例应用程序中使其工作了。但是在我的另一个项目中,仍然无法触发注销事件。日志中没有错误。有什么解决方法吗? - Himal Patel
嗨@FatehMohamed,我在生产环境中遇到了一些addUserSignedOut问题,它在登录后立即调用,但在本地工作正常,有什么想法吗? - leobelizquierdo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接