博客
关于我
.Net Core 3.1 服务端配置跨域
阅读量:450 次
发布时间:2019-03-06

本文共 4070 字,大约阅读时间需要 13 分钟。

一、在Startup.cs 的 ConfigureServices 配置好跨域策略

public void ConfigureServices(IServiceCollection services) {     //添加cors     services.AddCors(options =>     {         //添加core 策略         options.AddPolicy("Policy1", //策略名             builder =>             {                 builder.WithOrigins("*", //表示可以被所有地址跨域访问                                     "http://localhost:3000",//允许跨域访问的地址,不能以正反斜杠结尾。                                     "http://*.localhost:3001")                                     .SetIsOriginAllowedToAllowWildcardSubdomains()//设置策略里的域名允许通配符匹配,但是不包括空。                                      //例:http://localhost:3001 不会被通过                                      // http://xxx.localhost:3001 可以通过                                     .AllowAnyHeader()//配置请求头                                     .AllowAnyMethod();//配置允许任何 HTTP 方法访问             });         //添加另外一个 core 策略 添加多个策略可以为不同域名的源进行配置。 策略名不能重复         options.AddPolicy("Policy2",             builder =>             {                 builder.WithOrigins("http://www.contoso.com")                                     .AllowAnyHeader()                                       .AllowAnyMethod();              });     });     services.AddControllers(); }

二、在Startup.cs 的 Configure开启跨域。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {     if (env.IsDevelopment())     {         app.UseDeveloperExceptionPage();     }     app.UseRouting();     //使用cors,注意中间件的位置位于UseRouting与UserAuthorization之间     app.UseCors();//此处如果填写了app.UserCors("Policy1"),则控制器中默认使用该策略,并且不需要在控制器上添加[EnableCors("Policy1")]     app.UseAuthorization();     app.UseEndpoints(endpoints =>     {         endpoints.MapControllers();     }); }

三、在控制器中设置跨域策略。

在微软的文档中,可以配置通用跨域,即无需编写跨域策略,开启所有源都可以跨域访问,则无需在控制器中设置是否开启跨域。

这里使用的方法,可以对每个控制器和Action 都可以设置是否允许跨域,更为安全灵活

1.在控制器类上添加[EnableCors("Policy1")] 属性。
[ApiController]    [Route("[controller]")]    [EnableCors("Policy1")] //表示在该控制器下所有Action 都可被满足“Policy1”策略的源跨域访问。    public class WeatherForecastController : ControllerBase    {        [HttpGet]        public string Get(){            return "get";        }        [HttpPost]        public string Post() {            return "post";        }    }

表示在该控制器下所有Action 都可被满足“Policy1”策略的源跨域访问。

2.在Action 方法上添加[EnableCors("Policy1")] 属性。
[ApiController]    [Route("[controller]")]    public class WeatherForecastController : ControllerBase    {        [EnableCors("Policy1")] //表示Get方法可以被满足“Policy1”策略的源跨域访问,而同控制器下的Post方法不可。        [HttpGet]        public string Get(){            return "get";        }        [HttpPost]        public string Post() {            return "post";        }    }

表示Get方法可以被满足“Policy1”策略的源跨域访问,而同控制器下的Post方法不可。

3.在控制器基类中添加[EnableCors("Policy1")] 属性
//基类 [EnableCors("Policy1")] public class BaseController:ControllerBase { }
//控制器类[ApiController][Route("[controller]")]public class WeatherForecastController : BaseController{    [HttpGet]    public string Get(){        return "get";    }    [HttpPost]    public string Post() {        return "post";    }}
此时WeatherForecastController 继承次添加了 [EnableCors("Policy1")]属性的 BaseController,所以WeatherForecastController 下的所有Action 都可被满足“Policy 1” 策略的源访问。
[ApiController]  [Route("[controller]")]  public class WeatherForecastController : BaseController  {      [HttpGet]      public string Get(){          return "get";      }      [HttpPost]      public string Post() {          return "post";      }      [DisableCors]      [HttpDelete]      public string Delete() {          return "delete";      }  }

此时delete方法因添加[DisabelCors] 属性 而不启用所属控制器从父类继承过来的跨域策略。

四、CORS 策略选项(配置cors策略时可以设置)

设置允许的 HTTP 方法

options.AddPolicy("Policy1",    builder =>    {        builder.WithOrigins("http://localhost:3000")               .WithMethods("POST","DELETE");//允许所有则直接使用:AllowAnyMethod()    });

设置允许的请求标头

options.AddPolicy("Policy1",    builder =>    {        builder.WithOrigins("http://localhost:3000")              .WithHeaders(HeaderNames.ContentType, "x-custom-header");              //当设置WithHeaders时,请求源的标头需与设置的标头完全匹配 策略才能生效。              //允许所有则直接使用:AllowAnyHeader()    });

 

转载地址:http://gtwbz.baihongyu.com/

你可能感兴趣的文章
Python 利用Python操作excel表格之openyxl介绍Part1
查看>>
排错-lr回放错误Vuser failed to initialize extensi...解决方法
查看>>
Loadrunner 脚本优化-事务函数简介
查看>>
loadrunner 脚本优化-参数化方法
查看>>
Easyui datagrid combobox输入框非法输入判断与事件总结
查看>>
Vue 使用Use、prototype自定义全局插件
查看>>
webpack 的 sourse-map 中 eval、cheap、inline 和 module 各是什么意思?
查看>>
设计模式点滴
查看>>
javascript 实现页面上禁止选择(复制)
查看>>
[转]Best practices for creating websites in IIS 6.0
查看>>
发布一款小软件:和讯博客助手-新闻采集测试版- 0.1.0
查看>>
Angular入门到精通系列教程(10)- 指令(Directive)
查看>>
通过VS2010性能分析来查找代码中那些地方最损耗资源
查看>>
数值压缩存储方法Varint
查看>>
dotnet core开源博客系统XBlog介绍
查看>>
vuejs集成echarts的一些问题
查看>>
BeetleX数据分析中间服务V3
查看>>
Http压力测试工具HttpTest4Net
查看>>
azure存储压测的问题(农码主观意识太强被坑了)
查看>>
Nhibernate初学
查看>>