我正在尝试启用CORS,但我的AngularJS网络应用程序发送的每个请求都会遇到同样的问题:
阻止跨源请求:同源策略禁止在https://.../读取远程资源...(原因:缺少CORS头“Access-Control-Allow-Origin”)。
只有Firefox才会出现!它与Chrome,Safari,IE和Edge完美配合。
环境:
我的API是托管在Azure App Services(IIS 8.0)上的.NET Web Api 2.3(.NET 4.6)。
我的前端应用是一个AngularJS网络应用程序,我通过https访问,并通过https使用API。
我做了什么: 我有一个Startup类,它被声明为Owin的启动入口点。
[assembly: OwinStartup(typeof(Startup))]
namespace SentinelleApi
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.Map("/signalr", map =>
{
map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
EnableDetailedErrors = true,
EnableJavaScriptProxies = false
};
map.RunSignalR(hubConfiguration);
});
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
}
}
我有一个WebApiConfig类,声明如下:
namespace SentinelleApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// No need to declare config.EnableCors() here, the app.UseCors(...) does the job in startup section
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);
}
}
}
我没有触摸web.config手动添加标题(我试过,但它没有解决我的问题)。无论如何,不建议在web.config中添加这些头文件并同时拥有app.UseCors()。
所以,在Firefox上,我有CORS错误,但在Safari / Chrome上,没问题!
除了Firefox,我有Access-Control-Allow-Origins。
在Chrome上:
在Firefox上:
修改 好吧,我已经调查了一下,如果我将我的webapp地址从https://切换到http://,一切都在Firefox上工作正常(同样,我的API可以通过https使用Angular,没有CORS问题)所有)...
我真的不明白发生了什么,但神奇的是,Access-Control-Allow-Origin出现在Firefox使用的每条API路由上,而当它是安全连接(https)时则不然。我依赖来自Microsoft的https Azure证书,这似乎是有效的(锁定图标为绿色)。
当然,我想保留https,但我不知道如何解决我的问题。
似乎与:Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers
有关我已经针对Web应用客户端(主持AngularJS)制定了重写规则。在我的web.config中,我有:
<rule name="RedirectToHTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
<add input="{URL}" pattern="/$" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="SeeOther" />
</rule>
当我删除它时,它很好(我的网络应用程序可以通过HTTP访问),但是当我切换到HTTPS时,即使API服务器接受所有来源,它也会失败。
所以问题:我是否应该添加一些特殊内容以使HTTPS /证书与CORS一起使用(在Firefox下)?
还相关:https://stackoverflow.com/questions/33743645/iis-reverse-proxy-to-bypass-cors-issue
答案 0 :(得分:5)
您认为自己可能遇到此问题Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers
Firefox使用chrome / IO中的其他证书存储区,您可以在工具下查看证书 - &gt;选项 - &gt;高级,然后你有一个按钮来查看ceritifcate商店。
答案 1 :(得分:3)
我遇到了完全相同的问题,并且错误似乎在新版本的Firefox-45.0.0 上修复了。尝试更新并再次检查。我将向用户解释这个问题,并指导他们进行升级。
答案 2 :(得分:1)
我遇到了一个PHP脚本的问题,该脚本会检查“Origin”请求标头,并添加“Access-Control-Allow-Origin”响应标头(如果它与预期的匹配)。
最后问题是firefox将标题发送为'origin'(全部小写),而我的脚本正在寻找标准标题'Origin' (混合案例)。
修复是为全小写“origin”请求标头添加处理程序。