这实际上可能不是 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_iframe
和 client_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/