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

原文链接:https://www.jianshu.com/p/534b9a6a6ed5

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //添加cors
  4. services.AddCors(options =>
  5. {
  6. //添加core 策略
  7. options.AddPolicy("Policy1", //策略名
  8. builder =>
  9. {
  10. builder.WithOrigins("*", //表示可以被所有地址跨域访问
  11. "http://localhost:3000",//允许跨域访问的地址,不能以正反斜杠结尾。
  12. "http://*.localhost:3001")
  13. .SetIsOriginAllowedToAllowWildcardSubdomains()//设置策略里的域名允许通配符匹配,但是不包括空。
  14. //例:http://localhost:3001 不会被通过
  15. // http://xxx.localhost:3001 可以通过
  16. .AllowAnyHeader()//配置请求头
  17. .AllowAnyMethod();//配置允许任何 HTTP 方法访问
  18. });
  19. //添加另外一个 core 策略 添加多个策略可以为不同域名的源进行配置。 策略名不能重复
  20. options.AddPolicy("Policy2",
  21. builder =>
  22. {
  23. builder.WithOrigins("http://www.contoso.com")
  24. .AllowAnyHeader()
  25. .AllowAnyMethod();
  26. });
  27. });
  28. services.AddControllers();
  29. }

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

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

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

在微软的文档中,可以配置通用跨域,即无需编写跨域策略,开启所有源都可以跨域访问,则无需在控制器中设置是否开启跨域。
这里使用的方法,可以对每个控制器和Action 都可以设置是否允许跨域,更为安全灵活

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

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

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

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

3.在控制器基类中添加[EnableCors("Policy1")] 属性
  1. //基类
  2. [EnableCors("Policy1")]
  3. public class BaseController:ControllerBase
  4. {
  5.  
  6. }
  1. //控制器类
  2. [ApiController]
  3. [Route("[controller]")]
  4. public class WeatherForecastController : BaseController
  5. {
  6. [HttpGet]
  7. public string Get(){
  8. return "get";
  9. }
  10.  
  11. [HttpPost]
  12. public string Post() {
  13. return "post";
  14. }
  15. }
此时WeatherForecastController 继承次添加了 [EnableCors("Policy1")]属性的 BaseController,所以WeatherForecastController 下的所有Action 都可被满足“Policy 1” 策略的源访问。
  1. [ApiController]
  2. [Route("[controller]")]
  3. public class WeatherForecastController : BaseController
  4. {
  5. [HttpGet]
  6. public string Get(){
  7. return "get";
  8. }
  9.  
  10. [HttpPost]
  11. public string Post() {
  12. return "post";
  13. }
  14.  
  15. [DisableCors]
  16. [HttpDelete]
  17. public string Delete() {
  18. return "delete";
  19. }
  20.  
  21. }

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

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

设置允许的 HTTP 方法

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

设置允许的请求标头

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

.Net Core 3.1 服务端配置跨域的更多相关文章

  1. asp.net core webapi 服务端配置跨域

    在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...

  2. php服务端允许跨域访问

    >>php服务端允许跨域访问<< >>同源策略和跨域解决方案<<

  3. PHP服务端支持跨域

    跨域 由于浏览器的同源策略,导致浏览器页面访问非同源(协议.域名.端口任一不同)服务器产生跨域问题! PHP服务端配置支持跨域: // 指定允许其他域名访问, * 表示全部域名 header('Acc ...

  4. php 服务端允许跨域访问

    加上需要允许跨域访问,配置如下(一下配置内容前不允许有其他任何输出操作): //设置允许跨域的 请求源地址//方式一:header("Access-Control-Allow-Origin: ...

  5. [django]django配合前端vue前后端联调,django服务端解决跨域(django-cors-headers)

    django内部csrf post提交数据解决 https://www.cnblogs.com/iiiiiher/articles/9164940.html 前端写了个页面,里面$.post发现403 ...

  6. nodejs设置服务端允许跨域

    //设置跨域访问 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", ...

  7. Asp.Net WebApi服务端解决跨域方案

    1.特性方式 主要是继承ActionFilterAttribute,重写OnActionExecuted方法,在action执行后,给响应头加上一个键值对. using System.Web.Http ...

  8. Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置

    服务端配置 Silo通过SiloHostBuilder和许多补充选项类以编程方式进行配置. Silo配置有几个关键方面: Orleans集群信息 集群提供程序(不知道咋翻译) Silo到Silo和Cl ...

  9. mpush 服务端配置 for windows 服务自动运行

    mpush 服务端配置 以下安装部分是参照官方的步骤, 一.安装jdk1.8并配置环境变量 示例:  http://www.cnblogs.com/endv/p/6439860.html 二.Wind ...

  10. .net core 配置跨域

    使用场景: 由于浏览器的同源策略,即浏览器的安全功能,同源策略会阻止一个域的js脚本和另一个域的内容进行交互. 会出现以下报错: 怎样属于非同源呢? 协议.域名.端口号只要有一个不相同就是属于非同源 ...

随机推荐

  1. 利用python的PyPDF2和PyMuPDF库玩转PDF的提取、合并、旋转、缩放、加密

    一.安装PyPDF2和PyMuPDF库 pip install PyPDF2 pip install pymupdf # fitz是pymupdf的子模块 二.工具类代码 from PyPDF2 im ...

  2. vulnhub_me and my grilfriend

    解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...

  3. 《深入理解Java虚拟机》读书笔记:Class类文件的结构

    Class类文件的结构 Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式--字节码(ByteCode),从而实现了程序 ...

  4. 高性能MySQL实战(一):表结构

    最近因需求改动新增了一些数据库表,但是在定义表结构时,具体列属性的选择有些不知其所以然,索引的添加也有遗漏和不规范的地方,所以我打算为创建一个高性能表的过程以实战的形式写一个专题,以此来学习和巩固这些 ...

  5. 使用 KubeBlocks 为 K8s 提供稳如老狗的数据库服务

    原文链接:https://forum.laf.run/d/994 大家好!今天这篇文章主要向大家介绍 Sealos 的数据库服务.在 Sealos 上数据库后端服务由 KubeBlocks 提供,为用 ...

  6. 白话领域驱动设计DDD

    容我找个借口先,日常工作太忙,写作略有荒废.一直想聊下领域驱动设计,以下简称DDD,之前也看过一些教程,公司今年两个项目--银行核心和信用卡核心,都深度运用DDD成功落地,有人说DDD挺难理解,在此讲 ...

  7. SqlServer修改表字段类型

    if not exists (select 1 from syscolumns where name='字段名' and id=OBJECT_ID('表名') and 条件) begin alter ...

  8. 领域驱动模型DDD(四)——Eventuate Tram Saga源码讲解

    前言 虽然本人一直抱怨<微服务架构设计模式>中DDD模式下采用的Eventuate Tram Saga不算简单易用,但是为了更加深入了解原文作者的设计思路,还是花了点时间去阅读源码,并且为 ...

  9. 监听数组Array变化或Obj属性变化

    工作中经常会遇到监听数组发生变化时执行相应的回调触发逻辑,客户应用场景中需要实现对象变量的动态监听,当变量发生变化时触发回调函数,实现事件发送等应用场景.       通常由以下两种方式实现需求 一. ...

  10. Oracle主键自增列

    SQL Server创建主键自增列我们可以使用"ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY"一步到位创建,而Oracle创建主键自增列和SQ ...