如何在ASP中启用CORS。网络核心

我正在尝试在我的ASP上启用跨起源资源共享。NET核心Web API,但我卡住了。

EnableCors属性接受类型为stringpolicyName作为参数:

// 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核心Web API?

325638 次浏览

ASP。NET Core 6:

var  MyAllowSpecificOrigins = "_myAllowSpecificOrigins";


var builder = WebApplication.CreateBuilder(args);


builder.Services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});


// services.AddResponseCaching();


builder.Services.AddControllers();


var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();


app.UseCors(MyAllowSpecificOrigins);


app.UseAuthorization();


app.MapControllers();


app.Run();

更多示例请参见官方文档


ASP。NET Core 3.1和5.0:

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

public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyMethod()
.AllowAnyHeader();
}));


// ...
}

builder中的CorsPolicyBuilder允许你根据需要配置策略。你现在可以使用这个名字将策略应用到控制器和动作上:

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

基于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")]

适用于。net Core 1和。net Core 2

如果使用.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.UseCors中提到的策略名称。它可以是任何名字。

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

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

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

如果你在IIS上托管,一个可能的原因是你得到这个是因为IIS阻塞OPTIONS动词。我为此花了将近一个小时:

一个明显的迹象是你在OPTIONS请求期间得到了404错误。

要解决这个问题,你需要显式地告诉IIS 阻止OPTIONS请求。

进入请求过滤:

IIS Request Filtering

确保允许使用OPTIONS:

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>

特别是在dotnet核心2.2中,你必须改变SignalR

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

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

而是用.AllowCredentials()代替.AllowAnyOrigin()

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

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

步骤1:我们需要微软. aspnetcore . cors包在我们的项目。安装请进入“Tools -> NuGet Package Manager -> Manage NuGet Packages For Solution”。搜索“Microsoft.AspNetCore.Cors”,安装软件包。

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

enter image description here

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

enter image description here

更多详细信息点击这里

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

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

如果你得到错误"没有'Access-Control-Allow-Origin'头出现在请求的资源上"特别是对于删除请求,你可以尝试在IIS上禁用WebDAV。

显然,WebDAVModule默认启用,默认禁用PUT和DELETE请求。

禁用WebDAVModule,添加到你的web.config:

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

你有三种方式启用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时,UseCors必须在UseResponseCaching之前调用。

开启默认策略下的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(“{政策字符串}“))指定命名策略。

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

  1. 如果你看到CORS policy execution failed logged…不要认为你的CORS策略没有正确执行。事实上,CORS中间件工作正常,您的策略正在正确执行。这个措辞糟糕的消息的唯一含义是请求的起源不匹配任何允许的起源(看到源),即请求是不允许的。

  2. 原点检查(ASP.;NET Core 5.0)发生在一个非常简单的方式…例如,通过WithOrigins()提供的字符串与HttpContext.Request.Headers[Origin]中存在的字符串之间区分大小写的序数字符串比较(看到源)。

  3. 如果你用后面的斜杠/设置一个允许的原点,或者如果它包含大写字母,CORS会失败。(在我的情况下,我确实意外地复制了带有末尾斜杠的主机。)

覆盖每个端点。如果你想阻塞某个端点,使用这个注释[DisableCors]
这里描述得很好。 < / p >
https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0

  1. app.authentication()app.routing()之间添加app.usecors(policyName)如果你在上面使用app.usMvc()。在Configure方法中。

  2. 在configureService方法中

services.AddCors(options => options.AddPolicy(name: mypolicy,     builder =>     { builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin(); }));
  1. 在Each controller中添加[EnableCors("mypolicy")]
        [EnableCors("mypolicy")]
[Route("api/[controller]")] [ApiController]
public class MyController : ControllerBase




如:-

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

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

  1. 不太安全-启用访问控制-允许-凭据-留空,并添加*作为允许的原点
  2. 标记为启用访问控制-允许凭据,然后添加希望允许来自的请求的域

得到这个工作与。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()
);
...
}

安装包Microsoft.AspNetCore.CORS

ConfigureServices方法下的Startup.cs中,在services.AddMVC()之前添加以下代码

services.AddCors(options =>
{
options.AddPolicy("AllowMyOrigin", p =>
{
p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});

Startup.cs中,在Configure方法中,在调用app.UseMvc()之前添加app.UseCors("AllowMyOrigin");

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

.Net CORE 3.1使用:

app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader())

注意"/"最后-将阻塞CORS的原点

builder.WithOrigins("http://example.com/","http://localhost:55233/");

将阻止

使用

builder.WithOrigins("http://example.com","http://localhost:55233");

ASP。NET核心Web API

在ConfigureServices中添加services.AddCors();services.AddControllers();之前

在“配置”中添加UseCors

app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());

对于“c# - ASP Net Core Web API (Net Core 3.1 LTS)”,它对我来说是有效的……

Startup.cs文件中:

在“ConfigureServices"函数添加如下代码:

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

注意:如果"CorsPolicy"你可以根据自己的喜好进行更改,或者在“start”中使用全局变量;类。

在“配置"函数添加如下代码:

app.UseCors("CorsPolicy");

检查函数的调用顺序,它应该是这样的:

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}


app.UseHttpsRedirection();
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseAuthorization();


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

最后,在你的控制器类中,将下面的代码添加到你的函数之上:

[EnableCors("CorsPolicy")]

例如:

[EnableCors("CorsPolicy")]
[HttpPost("UserLoginWithGoogle")]
public async Task<ActionResult<Result>> UserLoginWithGoogle([FromBody] TokenUser tokenUser)
{
Result result = await usersGoogleHW.UserLoginWithGoogle(tokenUser.Token);
return new JsonResult(result);
}

注:“CorsPolicy"必须在启动和控制器中匹配。

祝你好运……

为Web API(ASP。Net core 6.0) 在Program.cs中,只需在builder.Build()之前添加

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

也添加

app.UseCors("corsapp");