我遇到一个问题,来自我的Angular JS应用程序的交叉原始请求在Chrome中运行良好,但在Firefox中运行不正常。
在Firefox中收到的错误是:
阻止跨源请求:同源策略禁止读取 https://api.domain.eu/join/joinstatus处的远程资源。 (原因: CORS标题'Access-Control-Allow-Origin'不匹配 'https://www.domain.eu,https://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
。
答案 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!