CORS政策已被我的子域屏蔽

时间:2019-08-12 18:48:37

标签: asp.net-core .net-core cors asp.net-core-webapi

我有一个相同的域,其中之一是没有前缀www的域。例如,

  1. https://www.example.com
  2. https://example.com

第一个域可以正常工作,因为它是默认域。但是当我执行CRUD或访问任何api服务时,第二个错误给了我。

  

在以下位置访问XMLHttpRequest   原产地的“ https://www.example.com/hubCon/negotiate”   “ https://example.com”已被CORS政策屏蔽:对   预检请求未通过访问控制检查:   响应中的“ Access-Control-Allow-Origin”标头不得为   当请求的凭据模式为“包括”时,使用通配符“ *”。的   XMLHttpRequest发起的请求的凭据模式为   由withCredentials属性控制。

我尝试了文章published by Microsoft中的代码,但是它不起作用。

我正在使用.Net Core 2.2版本。 这是我的Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(MyAllowSpecificOrigins,
            builder =>
            {
                builder.WithOrigins("https://example.com")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowAnyOrigin()
                .AllowCredentials();
            });
        });

        services.AddMvc().AddJsonOptions(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


        services.AddSignalR();
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseCors(MyAllowSpecificOrigins);
        app.UseForwardedHeaders(new ForwardedHeadersOptions
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        });

        app.UseHttpsRedirection();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseAuthentication();


        app.UseSignalR(routes =>
        {
            routes.MapHub<HubSignal>("/hubCon");
        });

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

所以,我不明白为什么项目会出错。

感谢您的回答。

2 个答案:

答案 0 :(得分:1)

您不能将AllowAnyOrigin与AllowCredentials一起使用。以下是一个允许通配符域带有CORS的示例。

此代码在ConfigureServices中:

services.AddCors(options =>
        {
            options.AddPolicy("_AllowOrigin",
                builder => builder
                    .SetIsOriginAllowedToAllowWildcardSubdomains()
                    .WithOrigins("https://localhost:44385", "https://*.azurewebsites.net", "http://*.azurewebsites.net")
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
                );
        });

别忘了在控制器中装饰动作:

    [EnableCors("_AllowOrigin")]

答案 1 :(得分:0)

发生这种情况是因为您同时指定了两者:

  • AllowAnyOrigin()
  • AllowCredentials();

不支持此配置。参见doc

指定AllowAnyOrigin和AllowCredentials是不安全的配置,可能会导致跨站点请求伪造。当同时使用两种方法配置应用程序时,CORS服务将返回无效的CORS响应。

您应该删除对AllowAnyOrigin方法的调用