如何在ASP.NET Core中启用CORS

时间:2015-08-11 12:37:58

标签: c# asp.net-core

我正在尝试在我的ASP.NET Core Web API上启用跨源资源共享,但我陷入困境。

EnableCors属性接受policyName类型的string作为参数:

// Summary:
//     Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
//   policyName:
//     The name of the policy to be applied.
public EnableCorsAttribute(string policyName);

policyName的含义是什么?如何在ASP.NET Core Web API上配置 CORS

17 个答案:

答案 0 :(得分:209)

您必须在ConfigureServices方法的应用程序启动时配置CORS策略:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

CorsPolicyBuilder中的builder可让您根据需要配置策略。您现在可以使用此名称将策略应用于控制器和操作:

[EnableCors("MyPolicy")]

或将其应用于每个请求:

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...
}

答案 1 :(得分:82)

这适用于.Net-Core 1.1

不幸的是,在这种特定情况下,文档非常混乱。所以我会让它变得简单:

  • Microsoft.AspNetCore.Cors nuget包添加到您的项目
  • ConfigureServices方法中,添加services.AddCors();
  • Configure方法中,在致电app.UseMvc()app.UseStaticFiles()之前,请添加:

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());
    

那就是它。每个客户都可以访问您的ASP.NET核心网站/ API。

.Net-Core 2.0

  • Microsoft.AspNetCore.Cors nuget包添加到您的项目
  • ConfigureServices方法中
  • ,在致电services.AddMvc()之前,请添加:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
    
  • Configure方法中,在致电app.UseMvc()之前,添加app.UseCors("AllowAll");

    AllowAll是我们需要在app.UserCors中提及的策略名称。它可以是任何名称。

答案 2 :(得分:31)

基于Henk's answer我已经能够提出特定的域,我想要允许的方法以及我想要为其启用CORS的头:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

用法:

[EnableCors("AllowSpecific")]

答案 3 :(得分:18)

按照以下说明使用 .Net Core 3.1 进行此操作

1。确保将UseCors代码放在app.UseRouting()之间;和app.UseAuthentication();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => {
            endpoints.MapControllers();
        });

2。然后将这段代码放在ConfigureServices方法中

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3。并且在基本控制器上方放置了

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

现在,我所有的控制器都将从BaseController继承并启用CORS

答案 4 :(得分:4)

  

您必须在Startup.cs类中进行配置

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });

答案 5 :(得分:2)

`

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAnyOrigin",
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });

        services.Configure<MvcOptions>(options => {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
        });            
    }

`

答案 6 :(得分:2)

如果您在IIS上托管,则可能的原因之一是因为IIS阻止了OPTIONS动词。因此,我花了将近一个小时的时间:

一个明显的迹象是,您在404请求期间遇到OPTIONS错误。

要解决此问题,您需要明确告知IIS 阻止OPTIONS请求。

转到请求过滤:

IIS Request Filtering

确保允许选项:

Make sure OPTIONS is True

或者,只需使用以下设置创建一个web.config

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

答案 7 :(得分:2)

特别是在带有SignalR的dotnet core 2.2中,您必须更改

.WithOrigins("http://localhost:3000")

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

.AllowAnyOrigin()代替.AllowCredentials()

https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/4483

答案 8 :(得分:1)

安装 nuget 包 #include <Variants.hpp> Variant v; ... if (VarIsStr(v)) { AnsiString str = v; // do something }

Microsoft.AspNetCore.CORS方法下的Startup.cs中,在ConfigureServices之前添加以下代码

services.AddMVC()

services.AddCors(options => { options.AddPolicy("AllowMyOrigin", p => { p.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); 方法内的 Startup.cs 中,在调用 Configure 之前添加 app.UseCors("AllowMyOrigin");

请注意,当从客户端发送请求时,请记住使用 https 而不是 http。

答案 9 :(得分:1)

步骤1:我们的项目中需要Microsoft.AspNetCore.Cors软件包。要进行安装,请转到工具-> NuGet软件包管理器->管理解决方案的NuGet软件包。搜索Microsoft.AspNetCore.Cors并安装该软件包。

第2步:我们需要将CORS注入到容器中,以便应用程序可以使用它。在Startup.cs类中,让我们转到ConfigureServices方法并注册CORS。

enter image description here

因此,在我们的服务器应用中,转到控制器-> HomeController.cs,然后将EnableCors装饰器添加到Index方法(或您的特定控制器和操作)中:

enter image description here

有关更多信息,Click Here

答案 10 :(得分:0)

如果出现错误“所请求的资源上没有'Access-Control-Allow-Origin'标头,”。专门针对 PUT DELETE 请求,您可以尝试在IIS上禁用WebDAV。

显然,WebDAVModule默认情况下处于启用状态,并且默认情况下禁用PUT和DELETE请求。

要禁用WebDAVModule,请将其添加到您的web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>

答案 11 :(得分:0)

您可以通过三种方式启用CORS:

  • 中间件中使用命名策略或默认策略。
  • 使用端点路由。
  • 具有 [EnableCors] 属性。

使用命名策略启用CORS:

public class Startup
{
    readonly string CorsPolicy = "_corsPolicy";

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(name: CorsPolicy,
                              builder =>
                              {
                                 builder.AllowAnyOrigin()
                                      .AllowAnyMethod()
                                      .AllowAnyHeader()
                                      .AllowCredentials();
                              });
        });

        // services.AddResponseCaching();
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();

        app.UseCors(CorsPolicy);

        // app.UseResponseCaching();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}
使用 UseResponseCaching 时,必须在 UseResponseCaching 之前调用

UseCors

使用默认策略启用CORS:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddDefaultPolicy(
                builder =>
                {
                     builder.AllowAnyOrigin()
                                      .AllowAnyMethod()
                                      .AllowAnyHeader()
                                      .AllowCredentials();
                });
        });

        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();

        app.UseCors();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

启用具有端点的CORS

public class Startup
{
    readonly string CorsPolicy = "_corsPolicy ";

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(name: CorsPolicy,
                              builder =>
                              {
                                  builder.AllowAnyOrigin()
                                      .AllowAnyMethod()
                                      .AllowAnyHeader()
                                      .AllowCredentials();
                              });
        });

        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();

        app.UseCors();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers()
                     .RequireCors(CorsPolicy)
        });
    }
}

启用具有属性的CORS

您有拖曳选项

  • [EnableCors] 指定默认策略。
  • [EnableCors(“ {Policy String}”))指定命名策略。

答案 12 :(得分:0)

一些故障排除技巧,在我设法在最微不足道的 CORS 问题上浪费了两个小时之后:

  1. 如果您看到 CORS policy execution failed 已记录...不要认为您的 CORS 策略没有正确执行。事实上,CORS 中间件工作正常,并且您的策略正在正确执行。这条措辞不当的消息唯一意味着请求的来源与任何允许的来源 (see source) 都不匹配,即请求被禁止。

  2. 起源检查(从 ASP.NET Core 5.0 开始)以一种非常简单的方式发生……即您通过 {{1 提供的字符串之间区分大小写的序数字符串比较 (see source) }} 以及 WithOrigins() 中存在的内容。

  3. 如果您使用尾部斜杠 HttpContext.Request.Headers[Origin] 设置允许的原点,或者它包含大写字母,则 CORS 可能会失败。 (在我的例子中,我确实不小心用斜杠复制了主机。)

答案 13 :(得分:0)

这涵盖了每个端点。如果你想阻止某个端点使用这个注释 [DisableCors]
它在这里描述得很好。 https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0

namespace CompanyApi2
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
                options.AddPolicy(name: mypolicy,
                    builder =>
                    {
                        builder.AllowAnyHeader().AllowAnyMethod()
                            .AllowAnyOrigin();
                    })); //add this
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddScoped<IDatarepository, DatabaseRepository>();
        }

        public string mypolicy = "mypolicy";

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseCors(mypolicy); //add this
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

答案 14 :(得分:0)

最近在 azure web app 上托管 web app 服务器时,不得不编辑 azure app cors 设置来解决这个问题(只有代码没有解决问题)

  1. 安全性较低 - 启用 Access-Control-Allow-Credentials - 将其留空并添加 * 作为允许的来源
  2. 标记 Enable Access-Control-Allow-Credentials,然后添加要允许来自的请求的域

答案 15 :(得分:0)

在 .Net Core 3.1 中使用如下:

ConfigureServices() 方法中:

 public void ConfigureServices(IServiceCollection services)
  {
   ...
   services.AddCors();
   ...
  }

Configure() 方法中:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
   ...
   app.UseCors(builder =>
          builder.AllowAnyOrigin()
          .AllowAnyHeader()
          .AllowAnyMethod()
        );
   ...
  }

答案 16 :(得分:0)

上面提到的所有解决方法都可能起作用,也可能不起作用,在大多数情况下将不起作用。我在这里给出了解决方案

Currently I am working on Angular and Web API(.net Core) and came across CORS issue explained below

以上提供的解决方案将始终有效。对于“ OPTIONS”请求,确实有必要启用“匿名身份验证”。使用此处提到的解决方案,您无需执行上述所有步骤,例如IIS设置。

无论如何,有人将我的上述帖子标记为与该帖子重复,但是我可以看到,该帖子仅用于在ASP.net Core中启用CORS,但我的帖子与在ASP.net Core中启用和实现CORS和角度的。