我正在构建一个React应用程序,我想使用OpenID Connect对用户进行身份验证。在我的开发环境中,OIDC权限是本地运行的Identity Server 4实例。
我找到了一个Github repo,它将oidc-client-js库与Redux集成在一起,所以我下载了example repo并将其指向我的Identity Server。我做的唯一其他更改是使用我的持票人令牌而不是样本使用的YouTube来调用本地API。
我有一个Windows环境。
在Chrome和Edge上,该示例运行良好。我能够使用承载令牌进行身份验证并成功调用我的本地API。但是,在Firefox上,虽然身份验证工作正常并且我的API被成功调用并显示结果,但几秒钟后,应用程序突然显示为用户签名。 (我说'看起来'因为它的行为就好像用户已经注销但如果我重新加载页面,那么用户已经过身份验证了。)
注意:我在这里删掉了一节。这是一只红鲱鱼。请参阅下面的更新1 ,其中介绍了Firefox如何添加第二个iframe。我的客户端没有注册重定向网址,导致重定向到IS4的错误页面,该错误页面负责这些CSP警告。
查看控制台日志,Chrome和Firefox之间的关键区别是我在Firefox中看到的警告:
内容安全政策:因'frame-ancestors'指令而忽略'x-frame-options'。
在对用户进行身份验证后,它会在控制台中显示一两秒钟。我怀疑这可能与Javascript OIDC客户端为检查会话而添加的iframe有关。这个iframe指向身份权限上的/ connect / checksession。
如果我在Firefox中导航到此checksession网址,我会在控制台中收到Javascript错误:
内容安全策略:页面的设置阻止了加载 自己的资源(“script-src”)。
我在Chrome中没有看到此错误。
此页面的Content-Security-Policy
为default-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中,因为它在checksession中报告了Firefox中的Javascript错误,但我不确定我能做些什么。
更新1
深入研究后,我发现第二个iframe被添加到调用身份权限的 connect / authorize 端点的页面时会出现问题,其中包含如下URL: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 调用期间记录的以下行(以及其他行):
授权请求中没有用户
显示错误:prompt = none,但用户未经过身份验证“。
但我仍然没有理解为什么会发生这种情况。
答案 0 :(得分:0)
直接使用oidc-client-js时,我在Chrome中间歇性地看到了这种行为。在我的例子中,在UserManager上添加对 clearStaleState 的调用似乎阻止了这种情况的发生。 编辑:具体来说,我在调用getUser()之前添加了它。
但由于它是间歇性的,如果你退出并清除了cookie和本地/会话存储,它会消失一段时间,我无法保证这会解决它。
答案 1 :(得分:0)
几个月后,我再次遇到此问题。这次我找出了问题所在。我在非本地主机域上本地托管身份服务器,但我的React应用程序在本地主机上运行。因此,Firefox跟踪保护开始发挥作用,并阻止Javascript OIDC客户端通过其iframe访问我的身份服务器上的cookie。切换到在本地主机端口上使用身份服务器可以解决此问题。我希望这可以帮助某人:)