如何在ASP.NET Core中启用CORS

Olu*_*emi 154 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);
Run Code Online (Sandbox Code Playgroud)

policyName意味着什么以及如何在ASP.NET Core Web API上配置CORS

Hen*_*ema 261

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

CorsPolicyBuilderbuilder允许您配置的策略,以您的需求.您现在可以使用此名称将策略应用于控制器和操作:

[EnableCors("MyPolicy")]
Run Code Online (Sandbox Code Playgroud)

或者将其应用于每个请求:

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

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现app.UseCors("MyPolicy")不能用于我的API端点.我需要在有问题的控制器端点上显式[EnableCors("MyPolicy")]. (10认同)
  • 您必须将该行放在任何端点之前. (9认同)
  • 来自[官方文档](https://docs.microsoft.com/en-us/aspnet/core/security/cors#enabling-cors-with-middleware):"为整个应用程序启用CORS添加CORS中间件使用`UseCors`扩展方法处理您的请求管道.请注意,CORS中间件必须位于您希望支持跨源请求的应用程序中任何已定义的端点之前(例如,在调用"UseMvc"之前)." (9认同)
  • 这个答案对我不起作用,因为缺少 Microsoft.AspNetCore.Cors nuget 包。 (4认同)
  • 允许任何来源是否有任何风险? (3认同)
  • 为了避免使用名称,您可以使用 AddDefaultPolicy (3认同)
  • 我在app.AddMvc()之后添加了app.UseCors(),但它不起作用。因为Use方法的顺序会影响中间件的工作方式! (2认同)

Vah*_*iri 94

这是为了 .Net-Core 1.1

不幸的是,在这个具体案例中,文档非常混乱.所以我会让它变得简单:

  • Microsoft.AspNetCore.Corsnuget包添加到您的项目中
  • ConfigureServices方法中,添加services.AddCors();
  • Configure方法调用之前app.UseMvc()app.UseStaticFiles(),加:

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());
    
    Run Code Online (Sandbox Code Playgroud)

而已.每个客户都可以访问您的ASP.NET核心网站/ API.

对于 .Net-Core 2.0

  • Microsoft.AspNetCore.Corsnuget包添加到您的项目中
  • ConfigureServices方法中,在调用之前services.AddMvc(),添加:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
    
    Run Code Online (Sandbox Code Playgroud)
  • Configure方法中,在调用之前app.UseMvc(),添加 app.UseCors("AllowAll");

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

  • 谢谢.我在UseMvc之后使用了AddCors,这导致它无法正常工作.你的唯一答案是提到这一点. (7认同)
  • 这是关键部分:`.UseCors()`在`.UseMvc()`之前 (6认同)
  • 是的,我想我只能启用其中一个! (2认同)
  • 我不认为这行不通。提供凭据时,您不能允许任何来源。我仍在努力让它发挥作用。 (2认同)
  • 浪费时间,在UserMvc之前不了解UseCors ...感谢您的帮助! (2认同)
  • @JasonGoemaat 从 .NET Core 2.2 开始,您不能同时使用 `AllowAnyOrigin` 和 `AllowCredentials`:https://github.com/aspnet/AspNetCore/issues/3106 - 您只能使用其中之一。 (2认同)

Olu*_*emi 36

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

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

用法:

[EnableCors("AllowSpecific")]
Run Code Online (Sandbox Code Playgroud)

  • "要批评或要求作者澄清",我认为这不是这种情况,而且Henk的回答已经被标记了.如果您想允许特定域名,我的答案是附加组件. (13认同)

tfa*_*tfa 31

.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();
});
Run Code Online (Sandbox Code Playgroud)
  1. 然后将这段代码放在ConfigureServices方法中
services.AddCors(options =>
{
    options.AddPolicy("CorsApi",
        builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
});
Run Code Online (Sandbox Code Playgroud)
  1. 在基本控制器上方我放置了这个
[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase
Run Code Online (Sandbox Code Playgroud)

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

  • 直到我将 UseCors 代码放在 app.UseRouting(); 之间,事情才对我有用。和 app.UseAuthentication();` (4认同)
  • 除了 @tfa 之外没有人提到 UseCors 代码的位置必须在 app.UseRouting(); 之间 和 app.UseAuthentication(); 有事啊! (2认同)
  • 直到我知道调用顺序很重要之前,CORS 才对我有用。谢谢! (2认同)

Rez*_*abi 13

您可以通过三种方式启用 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();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

使用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();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

使用端点启用 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)
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

使用属性启用 CORS

你有两个选择

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


Ros*_*sim 10

如果您在 IIS 上托管,一个可能的原因是您收到此消息是因为 IIS 正在阻止OPTIONS动词。因为这个,我花了将近一个小时:

一个迹象是您404OPTIONS请求期间遇到错误。

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

转到请求过滤:

IIS 请求过滤

确保允许 OPTIONS:

确保 OPTIONS 为 True

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

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。我尝试了 https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#enable-cors-with-endpoint-routing 上的所有内容,但我只收到 CORS 错误。直到有人指出你的答案......我想知道为什么 MS 的人不愿意在他们的指南中包含这个小提示。 (2认同)

Sun*_*ule 8

你必须在 Startup.cs 类中配置

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


PJ3*_*PJ3 7

特别是在使用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


小智 7

对于Web API(ASP.Net core 6.0)在Program.cs中只需在builder.Build()之前添加;

builder.Services.AddCors(p => p.AddPolicy("corsapp", builder =>
{
    builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader();
}));
Run Code Online (Sandbox Code Playgroud)

还添加

app.UseCors("corsapp");
Run Code Online (Sandbox Code Playgroud)


小智 5

`

    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"));
        });            
    }
Run Code Online (Sandbox Code Playgroud)

`

  • 我认为这不应该被否决。这是一种“替代”方式。您可以使用“UseCors()”方法,也可以像 Nathan 在这里所做的那样添加全局 MVC 过滤器。 (3认同)