Firefox

时间:2016-08-07 17:32:10

标签: angularjs firefox iis asp.net-web-api cors

我遇到一个问题,来自我的Angular JS应用程序的交叉原始请求在Chrome中运行良好,但在Firefox中运行不正常。

在Firefox中收到的错误是:

  

阻止跨源请求:同源策略禁止读取   https://api.domain.eu/join/joinstatus处的远程资源。 (原因:   CORS标题'Access-Control-Allow-Origin'不匹配   'https://www.domain.euhttps://www.domain.eu')。

可以成功发出请求,直到我向请求添加Authorization标头。

我的服务器(在IIS上运行的ASP.Net Web API)设置了以下标头:

Access-Control-Allow-Origin: https://www.domain.eu
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Authorization
Access-Control-Allow-Credentials: true

Firefox通过OPTIONS请求成功预先处理了请求。通过这看,我可以看到发送的Origin标头包含在返回的Access-Control-Allow-Origin标头中。

事实上,由于某种原因,返回的Access-Control-Allow-Origin标题有两次我的域名(尽管在配置中指定了一次),例如。

Access-Control-Allow-Origin: https://www.domain.eu, https://www.domain.eu

除此之外,Firefox和Chrome在这方面的区别是什么?

我还需要做什么才能在Firefox中使用?

更新

我注意到如果我按照以下方式设置标题......

`Access-Control-Allow-Origin:https://www.domain.eu'

...然后飞行前OPTIONS请求正常。 请求和响应中的Access-Control-Allow-Origin标头相同。但是,实际的GET请求会因上述错误而失败。

如果我按如下方式修改标题:

Access-Control-Allow-Origin: https://www.domain.eu, https://www.domain.eu

...(这是Firefox在错误中提到的),然后实际的飞行前OPTIONS请求失败,因为这次Firefox只需要标题中的单个值https://www.domain.eu

3 个答案:

答案 0 :(得分:0)

尝试:

Access-Control-Allow-Origin: https://www.domain.eu, https://domain.eu

Access-Control-Allow-Origin: https://*.domain.eu, http://*.domain.eu

Access-Control-Allow-Origin: domain.eu

Access-Control-Allow-Origin: *.domain.eu

修改

尝试:

Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
Access-Control-Request-Method: GET, POST, OPTIONS, PUT, DELETE

文档:

使用-控制允许来源

  

返回的资源可能有一个Access-Control-Allow-Origin标头,语法如下:

Access-Control-Allow-Origin: <origin> | *
  

origin参数指定可以访问资源的URI。浏览器必须强制执行此操作。对于没有凭据的请求,服务器可以将*指定为通配符,从而允许任何来源访问资源。

例如,要允许http://mozilla.com访问资源,您可以指定:

Access-Control-Allow-Origin: http://mozilla.com

您只能指定一个URI或*

答案 1 :(得分:0)

这个问题是由于我的解决方案中基本上有错误的NuGet包组合造成的。 Owin和Web API CORS都被使用,导致标题混淆。

我通过回到基础并找出我需要的软件包来解决这个问题,然后问题就消失了。

答案 2 :(得分:0)

您需要在Web API项目中启用CORS。 检查this