要使 oidc-client 与静默更新一起工作,您需要将 aurelia-app 放在一个不是 body 的元素上,这样您就可以将元素放置在 body 内但在 aurelia-app 之外。
这允许您将 IFrame 放在 aurelia-app 之外,从而防止 Aurelia 引导程序吃掉它并让 oidc-client 独立于 Aurelia 运行。
编辑
根据您的评论,以及我的一点记忆,我重新措辞/澄清:
会话检查器和静默更新功能彼此独立工作。您可以在会话检查器通过手动调用启动之前静默续订。您也可以在不执行任何静默更新的情况下启动会话检查器。它们只是方便一起使用,但这是它们唯一的关系。
我假设您使用混合流程并使用 RP 和 OP iframe 实现标准会话检查器,其中 OP iframe 在check_session.html
页面中,而 RP iframe 在您的 aurelia 应用程序中的某个位置。在我的一个项目中,我在index.html
aurelia-app 元素之外有 RP iframe,因此它独立于 aurelia 工作。但我想它不一定必须在那里。
当您将src
RP iframe 的属性设置为您的check_session.html的位置时,会话检查器将启动session_state
,check_session_iframe
并client_id
在哈希之后。
check_session.html页面将通过启动定期轮询来响应该请求,并在状态发生更改时将消息发回window
您的 aurelia 应用程序。
从您的 aurelia 应用程序中,您可以收听该消息并在signinSilent()
它指示状态更改时进行呼叫。在silent_renew.html页面中,您可以使用signinSilentCallback()
所有这些都到位了,当你启动会话检查器时真的没关系。把它藏在某处的某个功能中,最后加载该功能。
在应用程序启动期间,您需要担心的唯一两件事是:
- 检查是否开始
window.hash
并#code
调用signinRedirectCallback(code)
- 如果没有,请
signinSilent()
立即致电(这样您要检查的事情最少)
然后在完成其中任何一个之后,getUser()
检查它是否为空或expired
属性 === true。如果是其中任何一种情况,请执行signinRedirect()
. 如果没有,您的用户已通过身份验证,您可以让 aurelia 应用程序执行此操作并启动会话检查器等。
我绝对不会在 aurelia-app 中对您的 index.html 进行初始身份验证检查。因为如果 aurelia 恰好在 oidc 检查完成之前完成加载,则该过程将失败。您可能还希望将用户对象(和 UserManager)存储在某些缓存/服务/其他类型的单例类中,以便您可以轻松地从您的 aurelia 应用程序与 oidc 交互。