从http调用https时,Chrome会抛出CORS错误,并且ASP Core不会发送CORS标头

时间:2017-08-18 08:20:22

标签: asp.net-core cors

请求是否被视为CORS,即使它位于同一域中但具有不同协议的地址之间?

因为我在控制台中获得了代码401:

XMLHttpRequest cannot load 
https://xxx.yyy.com/appname/css/left-pane-menu.component.min.css. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://xxx.yyy.com' is therefore not allowed access. 
The response had HTTP status code 401.

一方面,asp核心不会为同一个来源发送cors标头,另一方面Chrome不会接受来自其他协议的请求。哇。

除了从同一协议调用资源外,我有哪些选择。 我做不到。我需要始终调用https,因为某些Azure Enterprise代理设置误导我的网站认为在使用https调用它时会调用http,因此html中的基本网址标记设置为http://xxx.yyy.com/myapp而Chrome会抛出该网址它无法从安全连接中访问不安全的资源。

我的Startup.cs看起来像这样:

public void ConfigureServices(IServiceCollection services)
{
      services.AddCors(); 
      services.AddMvc()
              .AddJsonOptions(x =>
              {
                    x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                });
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
            app.UseCors(c=>
                c
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials()
            );

        app.UseResponseCompression();

        app.UseStaticFiles(new StaticFileOptions());

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
            routes.MapSpaFallbackRoute("spa-fallback", new { controller = "Home", action = "Index" });
        });
}

1 个答案:

答案 0 :(得分:1)

您需要将CORS设置为类似的内容,因为https://xxx.yyy.comhttp://xxx.yyy.com被视为不同的来源。

背后的原因是,不同的端口也被归类为不同的起源,http在端口80上运行,htt在443上运行。

有些浏览器确实以不同的方式对待这种情况,即Internet Explorer(或以前不确定新版本是否仍然如此)将不同的端口视为相同的原始版本,Firefox和Chrome不同(这是正确的)根据规范行为。

options.AddPolicy("YYYOrigin", policyBuilder =>
{
    policyBuilder
         // you need to specify both
        .WithOrigins("https://xxx.yyy.com", "http://xxx.yyy.com")
        .AllowAnyMethod()
        .AllowAnyHeader();
});

app.UseCors("YYYOrigin");