为什么这个CORS请求仅在Firefox中失败?

rq_*_*rq_ 22 firefox cors fetch-api

我正在使用凭据和预检请求实现CORS,我有点不知道为什么预检请求在Firefox 30中始终失败但在Safari(7.0.2)和Chrome 35中有效.我认为这个问题与" 为什么会这样做有所不同" 经过身份验证的CORS请求的预检OPTIONS请求在Chrome中运行但不在Firefox中运行? "因为我没有收到401,而是来自浏览器客户端的特定于CORS的消息:

"跨源请求被阻止:同源策略不允许在http://myurl.dev.com上读取远程资源.这可以通过将资源移动到同一域或启用CORS来解决."

没有显示源代码,这就是我正在做的事情:

在服务器上:

OPTIONS响应的标题:

  • Access-Control-Allow-Origin:[[来自请求的原点]]
  • 访问控制允许方法:"POST获取选项"
  • Access-Control-Allow-Headers:"X-Requested-With"
  • Access-Control-Allow-Credentials:"true"

POST响应的标题:

  • Access-Control-Allow-Origin:[[来自请求的原点]]
  • Access-Control-Allow-Credentials:"true"

在浏览器客户端中:

jQuery.ajax({
  url: requestUrl,
  type: 'POST',
  data: getData(),
  xhrFields: {
    withCredentials: true
  }
});
Run Code Online (Sandbox Code Playgroud)

根据规范,这将触发OPTIONS预检请求,该请求需要在其响应中具有CORS头.我已经多次阅读过W3C规范了,在预检响应中我无法确定我做错了什么,如果有的话.

der*_*783 90

问题: “为什么此 CORS 请求仅在 Firefox 中失败?”


解答: 虽然与 OP 的具体情况无关,但它可能会帮助您了解 Firefox 默认情况下不信任 Windows 证书存储中的 CA(证书颁发机构),这可能会导致 Firefox 中的 CORS 请求失败(正如Svish 在问题评论中)。


要允许 Firefox 信任 Windows 证书存储中的 CA:

  • about:config在 Firefox 中,在地址栏中输入
  • 如果出现提示,请接受任何警告
  • 右键单击创建一个新的布尔值,然后输入security.enterprise_roots.enabled名称将值设置为true
  • 然后重新测试失败的请求

答案来源:https://support.umbrella.com/hc/en-us/articles/115000669728-Configuring-Firefox-to-use-the-Windows-Certificate-Store

  • 这也适用于 Mac (3认同)
  • 出色的!Firefox 一直让我发疯,要求(本机)“身份验证”并拒绝我的内部应用程序上的 CORS 请求(Chrome 和 Edge 没有问题) (2认同)

Ann*_*nne 10

请注意,Firefox是唯一符合此处的浏览器.如果Access-Control-Allow-Methods根据https://fetch.spec.whatwg.org/#cors-preflight-fetch解析失败,则需要返回网络错误.并且根据标题值的ABNF,它绝对是逗号分隔值.


rye*_*nus 5

Firefox 87(2021 年 3 月发布)开始,可以在about:config(即 Firefox 配置编辑器)中设置以下首选项:

network.cors_preflight.allow_client_cert: true
Run Code Online (Sandbox Code Playgroud)

来自Firefox Enterprise 87 - 发行说明

使用 TLS 客户端证书的公司可以翻转network.cors_preflight.allow_client_cert首选项,以获得与 Google Chrome 兼容的 CORS 协议处理。特别是,与 Fetch 标准相反,这将传输 TLS 客户端证书以及 CORS 预检。有关详细信息,请参阅错误 1511151 。

参考: