【发布时间】:2016-05-11 21:21:56
【问题描述】:
我正在尝试启用 CORS,但对于从我的 AngularJS Web 应用程序发送的每个请求,我总是遇到同样的问题:
跨源请求被阻止:同源策略不允许读取位于https://.../...的远程资源(原因:CORS 标头“Access-Control-Allow-Origin”缺失)。
它只发生在 Firefox 上!它与 Chrome、Safari、IE 和 Edge 完美配合。
环境:
我的 API 是托管在 Azure 应用服务 (IIS 8.0) 上的 .NET Web Api 2.3 (.NET 4.6)。
我的前端应用程序是一个 AngularJS Web 应用程序,我通过 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 中添加这些 headers 并同时拥有 app.UseCors()。
所以,在 Firefox 上,我有 CORS 错误,但在 Safari/Chrome 上,没问题!
除了 Firefox,我在任何地方都有 Access-Control-Allow-Origins。
在 Chrome 上:
在 Firefox 上:
编辑: 好吧,我已经进行了更多调查,如果我将我的 webapp 地址从 https:// 切换到 http://,那么在 Firefox 上一切正常(此外,Angular 可以通过 https 使用我的 API,而不会出现 CORS 问题全部)...
我真的不明白发生了什么,但神奇的是,Access-Control-Allow-Origin 出现在 Firefox 使用的每个 API 路由上,而当它是安全连接 (https) 时,情况并非如此。我依赖微软的 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/Certificate 与 CORS 一起工作(在 Firefox 下)?
还相关:https://stackoverflow.com/questions/33743645/iis-reverse-proxy-to-bypass-cors-issue
【问题讨论】:
-
您的 Angular 应用程序会一直在同一个域中运行吗?如果是这样,您可以将该域添加到 yourdomain.com" >。
-
确实,我的 Angular 应用程序始终在同一个域中,但明确添加其 URL 而不是 * 不会改变
-
您是否尝试过删除该行:var cors = new EnableCorsAttribute("", "", "*");
-
是的,没有变化。而且我已经检查了添加到控制器,甚至没有更好。事实上,当我使用 REST 客户端(来自 Firefox 或 Chrome)调用我的 API 时,我没有 Access-Control-Allow-Origins 标头响应
-
我建议您使用 Fiddler/Ethereal(或类似的,使用 HTTPS 设置有些麻烦但可行)来捕获真正的 HTTP 流量。 IIRC 浏览器并不总是在开发人员工具中显示此信息。验证原因是浏览器 (FF) 未使用正确的发送标头(并提交错误报告)或您的服务器未发送正确的 CORS 标头。
标签: c# asp.net azure asp.net-web-api cors