为什么 Firefox 在使用 Redix OIDC 时自动注销我的用户?

Why is Firefox logging my user out automatically when using Redix OIDC?

我正在构建一个 React 应用程序,我想在其中使用 OpenID Connect 对用户进行身份验证。在我的开发环境中,OIDC 权限是 Identity Server 4 的本地 运行 实例。

我找到一个 Github repo which integrates the oidc-client-js library with Redux so I downloaded the example repo 并将其指向我的身份服务器。我所做的唯一其他更改是使用我的不记名令牌而不是示例使用的 YouTube 调用本地 API。

我有一个Windows环境。

在 Chrome 和 Edge 上,该示例完美运行。我能够使用不记名令牌进行身份验证并成功调用我的本地 API。然而,在 Firefox 上,虽然身份验证工作正常并且我的 API 被成功调用并显示结果,但几秒钟后应用程序突然出现让用户注销。 (我说 'appears' 是因为它表现得好像用户已注销,但如果我重新加载页面,则用户已经通过身份验证)。


注意:我在这里划掉了一部分。这是一条红鲱鱼。请参阅下面的 更新 1,其中描述了 Firefox 如何添加第二个 iframe。没有为我的客户端注册重定向 URL,导致重定向到 IS4 的错误页面,该页面负责这些 CSP 警告。

查看控制台日志,Chrome 和 Firefox 之间的一个主要区别是我在 Firefox 中看到的警告:

Content Security Policy: Ignoring ‘x-frame-options’ because of ‘frame-ancestors’ directive.

这会在验证用户身份后一两秒出现在控制台中。我怀疑这可能与 Javascript OIDC 客户端为检查会话而添加的 iframe 有关。此 iframe 指向身份权限上的 /connect/checksession。

如果我在 Firefox 中导航到此检查会话 URL,我会在控制台中收到 Javascript 错误:

Content Security Policy: The page's settings blocked the loading of a resource at self ("script-src").

我在 Chrome 中没有看到这个错误。

此页面的 Content-Security-Policydefault-src 'none'; script-src 'sha256-VDXN0nOpFPQ102CIVz+eimHA5e+wTeoUUQj5ZYbtn8w='


我可以提供的唯一其他信息是控制台日志,这些日志以 Firefox 的形式编写,似乎将用户注销:

Action type: redux-oidc/USER_SIGNED_OUT 
Action payload: undefined
State before: Object { routing: {…}, oidc: {…}, subscriptions: {…} }
State after: Object { routing: {…}, oidc: {…}, subscriptions: {…} }

我希望有人可以使用此信息为我指明正确的方向,因为我真的不确定这里的问题是什么。看来问题出在 Identity Server 中,因为它报告 Firefox 在检查会话时出现 Javascript 错误,但我不确定我能做些什么。


更新 1

深入研究后,我发现当第二个 iframe 添加到页面时会出现问题,该页面使用 [=78= 调用身份授权机构的 connect/authorize 端点] 像这样:http://identity.domain.com/connect/authorize?client_id=js&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsilent_renew.html&response_type=id_token&scope=openid&state=9d87c43c58c84fddbde5fd9aa0f97df7&nonce=826fb8d6dc114549810584ddd01a3271&prompt=none。这只发生在 Firefox 上。在 Chrome 和 Edge 中,永远不会添加第二个 iframe。查看 Identity Server 日志,我看到在响应此 connect/authorize 调用期间记录了以下行(以及其他行):

No user present in authorize request

Showing error: prompt=none was requested but user is not authenticated".

但我仍然无法理解为什么会这样。

当直接使用 oidc-client-js 时,我在 Chrome 中间歇性地看到了这种行为。在我的例子中,在 UserManager 上添加对 clearStaleState 的调用似乎阻止了这种情况的发生。 编辑:具体来说,我在调用 getUser() 之前添加了它。

但由于它是间歇性的,如果您注销并清除 cookie 和 local/session 存储,它会消失一段时间,我不能保证这会修复它。

几个月后,我再次遇到了这个问题。这次我找出了问题所在。我在非本地主机域上本地托管我的身份服务器,但我的 React 应用程序在本地主机上 运行。因此,Firefox 跟踪保护启动并阻止 Javascript OIDC 客户端通过其 iframe 访问我的身份服务器上的 cookie。切换到在本地主机端口上使用身份服务器解决了这个问题。我希望这对某人有帮助:)