如何在ASP.NET Core中启用CORS


189

我试图在我的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


Answers:


325

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

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

    // ...
}

通过CorsPolicyBuilderbuilder您可以根据需要配置策略。现在,您可以使用此名称将策略应用于控制器和操作:

[EnableCors("MyPolicy")]

或将其应用于每个请求:

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();
}

12
我发现app.UseCors(“ MyPolicy”)不适用于我的API端点。我需要在有问题的控制器端点上显式[EnableCors(“ MyPolicy”)]。
robbpriestley16年

9
来自官方文档:“要为整个应用程序启用CORS,请使用UseCors扩展方法将CORS中间件添加到您的请求管道中。请注意,CORS中间件必须在您要支持跨域请求(例如。之前任何呼叫UseMvc)“。
亚历克斯·克劳斯

2
我在app.AddMvc()之后添加了app.UseCors(),但它不起作用。因为Use方法的顺序会影响中间件的工作方式!
Obay Abd-Algader

1
有允许任何来源的风险吗?
珀西

由于缺少Microsoft.AspNetCore.Cors nuget软件包,因此该答案对我不起作用。
瑞文(Reven)

108

适用于.NET Core 1和.Net Core 2(进一步)

如果使用 .Net-Core 1.1

不幸的是,在这种特定情况下,文档非常令人困惑。因此,我将使其变得非常简单:

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

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

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


如果使用 .Net-Core 2.0

  • Microsoft.AspNetCore.Corsnuget包添加到您的项目
  • 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
是的,以为我只能启用其中之一!
eugeneK

7
谢谢。我在UseMvc之后安装了AddCors,这导致它无法正常工作。您的唯一提及这一点的答案。
JesseNewman17年

1
我不认为这是行不通的。提供凭据时,您不允许任何来源。我仍在努力使它起作用。
杰森·古玛

7
那是关键:.UseCors()之前.UseMvc()
Neps

3
浪费时间,在UserMvc之前不了解UseCors ...感谢您的帮助!
托马斯

37

根据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();
}

用法:

[EnableCors("AllowSpecific")]

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
zrvan 2015年

14
To critique or request clarification from an author我认为情况并非如此,并且Henk的答案已经被标出。如果您想允许特定的域,我的答案是一个附加组件。
Oluwafemi 2015年

您的代码中缺少某些内容,“ IServiceCollection”不包含“ ConfigureCors”的定义。请检查并尝试给出完整的答案。
Sami-L

@ Sami-L请检查我更新的答案。我发现将其ConfigureCors更改为AddCors
Oluwafemi


7

如果您在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>


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"));
        });            
    }

`


规避已经部署的浏览器安全性的奇妙方法。只是不要!
JCKödel

2
我不认为这应该被否决。这是一种“替代”方式。您可以使用“ UseCors()”方法,也可以像Nathan一样添加全局MVC过滤器。
乔什·穆奇

这在.net core 2.2上对我有效,并添加了app.UseCors(“ AllowAnyOrigin”); 在“配置”方法中
Harry Sarshogh

“将Microsoft.AspNetCore.Cors nuget包添加到您的项目中”很重要。谢谢你提它!
梅森·张

5

按如下方式与.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


直到我place the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014年

1

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

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

在此处输入图片说明

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

在此处输入图片说明

欲了解更多详情,请点击这里


0

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

目前,我正在研究Angular和Web API(.net Core),并且遇到了下面解释的CORS问题

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.