更新记录
转载请注明出处:
2022年11月1日 发布。
2022年11月1日 从笔记迁移到博客。
说明
Cross-Origin Resource Sharing,跨域资源共享
配置方式
在ASP.NET Core中有2种方式配置跨越,中间件方式(middleware approach) 和 特性修饰方式(attributes approach)。
中间件方式一般用于配置全局的CORS配置。特性修饰方式配置跨域一般用于指定的控制器和动作。适用范围不同。
中间件方式配置Cors(Implementing CORS using the middleware approach)
开启UseCors() 中间件
具体实现实际上很简单,ASP.NET Core已经内置支持,只用开启 UseCors() 中间件即可。
打开Startup.cs文件,在配置开启CORS中间件即可。
namespace Catalog.API
{public class Startup{...public void Configure(IApplicationBuilder app, IWebHostingEnvironment env){...//开启CORSapp.UseCors(corsConfig =>{//具体的配置项corsConfig.AllowAnyOrigin();});..}}
}
配置具体的Cors规则(直接在中间件中配置)
配置允许所有的域名。
app.UseCors(corsConfig =>
{//允许所有域名corsConfig.AllowAnyOrigin();
});
配置允许指定的域名。其他域名都会被block。
namespace Catalog.API
{public class Startup{...public void Configure(IApplicationBuilder app, IWebHostingEnvironment env){...app.UseCors(corsConfig =>{//配置允许的域名corsConfig.AllowAnyOrigin("https://panda666.com");}); ...}}
}
配置具体的Cors规则(在服务中定义规则 Policy,在中间件中调用)
namespace Catalog.API
{public class Startup{public void ConfigureServices(IServiceCollection services){...//在服务中增加Cors服务services.AddCors(corsOtions =>{//增加 PolicycorsOtions.AddPolicy("BlogDomainPolicy", corsConfig => { //具体的配置项corsConfig.WithOrigins("https://samuele.dev"); });});..}public void Configure(IApplicationBuilder app,IWebHostingEnvironment env){...//在中间件中启用Cors,并使用指定策略app.UseCors("BlogDomainPolicy");...}}
}
在单独的扩展方法中定义Cors相关的配置
可以在ConfigureServices()中配置服务 和 Configure 配置中间件。为了提高可复用性、可维护性,还可以把相关的配置放入到自定义的扩展方法中。
在项目中添加Extensions文件夹。在Extensions文件夹下,添加ServiceCorsExtensions.cs类文件
然后在 ServiceCorsExtensions.cs 类文件中写入。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApplication6;
using Microsoft.Extensions.DependencyInjection;
namespace WebApplication6.Extensions
{public static class ServiceCorsExtensions{/// <summary>/// 配置跨域访问扩展方法/// </summary>/// <param name="services"></param>public static void ConfigureCors(this IServiceCollection services) =>//配置Corsservices.AddCors(options =>{options.AddPolicy("CorsPolicy", corsConfig =>corsConfig.AllowAnyOrigin() //配置允许的域名.AllowAnyMethod() //配置允许的HTTP方法.AllowAnyHeader()); //配置允许的头内容});}
}
说明:
AllowAnyOrigin()表示配置允许的域名,如果需要进行限制,可以使用WithOrigins("https://example.com")。
AllowAnyMethod()表示配置允许的HTTP方法,如果需要进行限制,可以使用WithMethods("POST", "GET")。
AllowAnyHeader()表示配置允许的头内容,如果需要进行限制,可以使用WithHeaders("accept", "contentype") 。
在Service中进行使用,在Startup.cs文件中的Startup类中
引入命名空间
using WebApplication6.Extensions;
配置服务,增加Cors服务。
public void ConfigureServices(IServiceCollection services)
{//添加服务,使用自定义的扩展方法services.ConfigureCors();services.AddControllers();
}
配置中间件,启动Cors中间件。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHttpsRedirection();app.UseStaticFiles();//使用跨域app.UseCors("CorsPolicy");//...
}
特性方式配置Cors(Implementing CORS using the attribute approach)
使用特性方式配置Cors,只在指定的Controller和Action上生效。配置和使用中间件配置大同小异。同样是先配置服务,在配置中间件。然后在指定的控制器或者动作方法上加入[EnableCors]特性修饰即可。
配置服务,增加Cors服务,并新增一个Policy策略。
builder.Services.AddCors(options =>
{options.AddPolicy("PandaPolicy", policyConfig =>{policyConfig.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();});
});
配置中间件,增加 Cors 中间件。
//启用Cors中间件
app.UseCors();
引入命名空间
using Microsoft.AspNetCore.Cors;
使用 [EnableCors] 特性启用,需要指定我们设置好的Policy策略。
namespace Catalog.API.Controllers
{[Route("api/items")][ApiController][JsonException][EnableCors("BlogDomainPolicy")]public class ItemController : ControllerBase{}
}
还可以在同一个控制器中,使用不同的 Policy 策略。
namespace Catalog.API.Controllers
{[Route("api/items")][ApiController][JsonException]//启用Cors[EnableCors("BlogDomainPolicy")]public class ItemController : ControllerBase{...[HttpGet("{id:guid}")]//启用Cors,策略不同[EnableCors("GetByIdActionPolicy")]public async Task<IActionResult> GetById(string id){...}}
}