【问题标题】:No Access-Control-Allow-Origin with Firefox, but works with Chrome and SafariFirefox 没有 Access-Control-Allow-Origin,但适用于 Chrome 和 Safari
【发布时间】: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


【解决方案1】:

你认为你会遇到这个问题吗Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers

Firefox 使用与 chrome/IO 不同的证书存储,您可以在工具 -> 选项 -> 高级下检查证书,然后您有一个按钮来查看证书存储。

【讨论】:

  • 可能是相关的,但我不认为证书无效或格式错误,因为我使用的 *azurewebsites.net 域与 Microsoft 签署的有效 https 证书相关联。跨度>
  • 但是,如果您在 Firefox 中检查您尝试通过 https 访问的链接。 Firefox 会抱怨吗?
  • 不,我没有收到来自 Firefox 的任何警报,它会像 Chrome 或 Safari 一样承认证书
  • 但是,我设法暂时修复了这个错误,调整了巴尔的摩 Cyber​​Trust 根证书,它“持有”微软提供的证书(Microsoft IT SSL SHA2)。但我不记得我是怎么做到的......我会再检查一遍
  • 我认为这绝对是一个错误,因为 Firefox 管理证书的方式。同样,我对任何其他浏览器都没有任何问题
【解决方案2】:

我遇到了完全相同的问题,这个错误似乎已在新的 Firefox 新版本 - 45.0.0 上得到修复。尝试更新并再次检查。我将向用户解释问题并指导他们进行升级。

【讨论】:

    【解决方案3】:

    我在使用 PHP 脚本时遇到了这个问题,该脚本会检查“Origin”请求标头,如果符合预期,则添加“Access-Control-Allow-Origin”响应标头。

    最后的问题是,Firefox 将标头发送为 'origin'(全小写),而我的脚本正在寻找标准标头 'Origin' (混合大小写)。

    修复是为全小写的“origin”请求标头添加一个处理程序。

    【讨论】:

    • 您能否添加更多关于如何为小写“原始”请求标头添加处理程序的详细信息?我在 IIS 中摸索了一下,我知道在哪里添加处理程序,但我不知道除此之外的语法。我对 IIS 7 很好奇。
    • 我只是复制了混合大小写的代码块并将字符串更改为全小写。在控制结构中使用“或”也可以实现同样的效果。
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 2017-12-01
    • 2014-10-21
    • 2016-11-09
    • 2016-09-30
    相关资源
    最近更新 更多