javascript - oidc-client CheckSessionIFrame 正确触发一次,然后每隔一段时间就会失败

标签 javascript iframe aurelia identityserver4

这实际上可能不是 Identity Server 或 oidc-client 的问题,但我无法确定问题。我在 Aurelia 应用程序中通过 System.js 运行此程序,因此问题可能源自这些外部库之一。

CheckSessionIFrame.start(session_state)中,我们有以下代码:

this._timer = window.setInterval(() => {
  this._frame.contentWindow.postMessage(this._client_id + " " + this._session_state, this._frame_origin);
}, this._interval);

第一次间隔触发时,似乎没有问题。 iFrame 的 contentWindow 存在(如预期)并且调用 postMessage 方法没有问题。两秒后,当间隔再次触发时,this._frame.contentWindow 未定义 - 所以我最好的猜测是 iFrame 正在以某种方式死亡。同样,这可能不是 oidc-client 的问题,但我正在寻找任何可能导致此 iFrame 死亡的有用指导(也许在内部它可能会在脚本上死亡?),例如缺少必要的配置值oidc-客户端。

最佳答案

要使 oidc-client 与静默更新配合使用,您需要将 aurelia-app 放置在非主体的元素上,这样您就可以将元素放置在主体内但位于 aurelia-app 外部的元素上。

这允许您将 IFrame 放在 aurelia-app 之外,从而防止 Aurelia Bootstrap 吃掉它,并让 oidc-client 独立于 Aurelia 运行。

编辑

根据您的评论,以及我的一些内存刷新,我重新措辞/澄清:

session 检查器和静默更新功能彼此独立工作。您可以在 session 检查器启动之前通过手动调用进行静默更新。您还可以启动 session 检查器而不进行任何静默更新。它们只是一起使用方便,但这就是它们唯一的关系。

我假设您使用混合流程并使用 RP 和 OP iframe 实现标准 session 检查器实现,其中 OP iframe 位于 check_session.html 页面中,而 RP iframe 位于某处在您的 aurelia 应用程序中。在我的一个项目中,我在 aurelia-app 元素之外的 index.html 中有 RP iframe,因此它独立于 aurelia 工作。但我想它不一定必须在那里。

当您使用 session_state 将 RP iframe 的 src 属性设置为 check_session.html 的位置时, session 检查器就会启动,哈希后的 check_session_iframeclient_id

check_session.html 页面将通过启动定期轮询来响应该情况,并在状态发生更改时将消息发送回 aurelia 应用程序的窗口

在您的 aurelia 应用程序中,您可以监听该消息,如果它指示状态已更改,则执行 signinSilent() 调用。在 silent_renew.html 页面中,您可以使用 signinSilentCallback()

进行响应

所有这些都已就位,当您启动 session 检查器时实际上并不重要。将其隐藏在某个功能中,最后加载该功能。

在应用程序启动过程中您需要担心的唯一两件事是:

  • 检查以 #code 开头的 window.hash,如果存在则调用 signinRedirectCallback(code)
  • 如果没有,只需立即调用 signinSilent()(这样您需要检查的事情就最少了)

然后在完成其中任一操作后,执行 getUser() 并检查它是否为 null 或 expired 属性 === true。如果是其中一种情况,请执行 signinRedirect()。如果没有,您的用户已通过身份验证,您可以让 aurelia 应用程序执行该操作并启动 session 检查器等。

我肯定不会将初始身份验证检查放在 aurelia-app 中的 index.html 上。因为如果 aurelia 恰好在 oidc 检查完成之前完成加载,则该过程将失败。您可能还希望将用户对象(和 UserManager)存储在某些缓存/服务/其他类型的单例类中,以便您可以轻松地从 aurelia 应用程序与 oidc 进行交互。

关于javascript - oidc-client CheckSessionIFrame 正确触发一次,然后每隔一段时间就会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746964/

相关文章:

javascript - 如何在 aurelia 中包含 elasticsearch javascript 库?

typescript - 如何在 Karma 中加载 Aurelia 插件

aurelia - 如何将子路由器注入(inject)对话框 View 模型

javascript - JQuery 多个功能不起作用

javascript - 如何用jquery显示多个div?

javascript - 是否有推荐的 HTML/CSS/JavaScript 编码风格指南?

javascript - Vimeo Iframe 注入(inject)广告软件?

ios - 无法加载网页 - 错误(NSURLErrorDomain 错误 -999)

angularjs - 如何在 iframe 中插入应用程序

ios - Iframe 中的 YouTube 嵌入播放器在 iOS6 中不起作用