.Net Core使用Cors实现Api跨域控制
一、导入包
.Net Core 需要引用一个包 Microsoft.AspNetCore.Cors,建议获取当前最新稳定版
二、跨域配置
让接口实现跨域,需要配置 Startup.cs 两个地方:
public void ConfigureServices(IServiceCollection services) { //添加cors 服务 配置跨域处理 services.AddCors(options => { options.AddPolicy("any", builder => { builder.AllowAnyOrigin() //允许任何来源的主机访问 .AllowAnyMethod() //允许任何HTTP方法 .AllowAnyHeader(); //允许所有的请求头 //.AllowCredentials();//允许跨域凭据,如cookie }); }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); }
app.UseRouting(); //启用Cors。必须将 UseCors 置于 UserRouting 之后,但在 UserAuthorization 之前 app.UseCors("any"); app.UseAuthorization();
app.UseHttpsRedirection(); app.UseMvc(); }
上面的代码是允许所有的跨域访问的设置,但是一般情况下,我们为了业务的安全肯定只会对访问做一些控制,不同的接口访问权限不同。这里时候我们需要做配置做一些修改。
下面我们做了两种跨域处理的情况。
public void ConfigureServices(IServiceCollection services) { //跨域 string[] Origins = Configuration["WhiteHosts"].Split(","); services.AddCors(options => { options.AddPolicy("CheckPolicy", builder => { builder.WithOrigins("https://www.example.com","https://www.baidu.com") .AllowAnyHeader() .AllowAnyMethod(); });
options.AddPolicy("NoPolicy", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); }
app.UseRouting(); //这里默认启用的配置是CheckPolicy app.UseCors("CheckPolicy"); app.UseAuthorization();
CheckPolicy:是只有请求接口的主机是 https://www.example.com 和 https://www.baidu.com 访问接口,相当于限制域名,其实这里不单单可以限制域名,还可以限制网络安全协议,端口等
NoPolicy:是允许所有的主机访问接口
这两个模式对请求方法和请求头都没有做要求。
三、具体使用
可以在控制器 Controller 或者 Action 方法上
这里可以直接在整个控制器上,加上 [EnableCors] 标签,也可以在单独的 Action 上加上标签。
[Route("[controller]/[action]")] public class HomeController : BaseApiController { [HttpPost] [EnableCors("NoPoliy")] //允许所有主机访问 public async Task<string> Token(LoginInputDTO input) { //业务代码 return null; } [HttpGet] [EnableCors] //默认启用的配置 public async Task<string> GetName(string userName) { //业务代码 return userName; }