安装程序CORS程序包
//一般默认都带了此程序包的
Install-Package Microsoft.AspNetCore.Mvc.Cors
ConfigureServices配置服务
public void ConfigureServices(IServiceCollection services)
{
//允许跨域
services.AddCors(options =>
{
//方法一:不做任何限制,允许所有来源
options.AddPolicy("any", policy =>
{
policy.SetIsOriginAllowed(_ => true)
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
//方法二:可信列表,允许一个或多个具体来源
options.AddPolicy("allow_list",
policy =>
{
policy.WithOrigins("http://*.loc.net", "https://*.loc.net", "http://localhost", "http://localhost:666")
.SetIsOriginAllowedToAllowWildcardSubdomains()//允许通配符 如:https://*.example.com
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
Configure配置请求管道
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//注意:1.必须位于UserMvc之前 2.自定义的跨域策略名称,必须和ConfigureServices中的AddPolicy的名称必须一致
//这里默认启用的配置是:allow_list
app.UseCors("allow_list");//将 CORS 中间件添加到你的 Web 应用程序管道,以允许跨域请求。
}
控制器 Controller 或者 Action 方法上单独设置
这里可以直接在整个控制器上,加上 [EnableCors] 标签,也可以在单独的 Action 上加上标签。
[Route("api/[controller]/[action]")]
[ApiController]
[EnableCors("any")]
public class DemoController : ControllerBase
{
[HttpGet, HttpPost]
public IActionResult GetDemoList()
{
List<object> objList = new List<object>();
objList.Add(new { id = 1, name = "10", money = 200.02D, dTime = DateTime.Now });
return new JsonResult(objList);
}
[HttpGet, HttpPost]
[EnableCors("any")]
public IActionResult GetDemoStr()
{
return new JsonResult("张三说:你好--1!");
}
}
AllowAnyOrigin
方法,在新的 CORS 中间件已经被阻止使用允许任意 Origin,所以该方法无效。AllowCredentials
方法,自从 .NET Core 2.2 之后,不允许和AllowAnyOrigin
同时调用。WithOrigins
方法,在 .NET Core 3.1 中有bug,具体原因未知,暂时只能用SetIsOriginAllowed(t=> true)
代替,等效.AllowAnyOrigin
方法。- 创建项目默认的模板中,
app.UseHttpsRedirection()
在前面,所以我将app.UseCors()
放在它后面,这是导致HTTP 307 Temporary Redirect
福报的根本原因之一。 - 度娘告诉我,
app.UseCors()
方法要在app.UseAuthentication()
之后,是误人子弟的,其实放在它前面也可以,并且app.UseCors()
要在app.UseRouting()
之后,app.UseEndpoints()
和app.UseHttpsRedirection()
之前 - 使用fetch跨域请求时,要注意controller的action是否有设置除了
HttpOptions
之外的其它Http Method方法,如果有要加上HttpOptions
标记特性,因为fetch跨域请求会先执行OPTIONS
预请求。 - 使用fetch请求需要JWT认证的接口时,除了在HTTP Headers设置
Authorization
之外,还需要设置'credentials': 'include'
。 - 写
app.UseXxxxxx
方法,引入中间件时,要注意管道(Middleware
)注册顺序。
参考:
- CORS配置:https://docs.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-3.1
- https://www.cnblogs.com/VAllen/p/dotnet-core-3-cors-fetch-response-307-temporary-redirect.html