重新整理 .net core 实践篇————跨域问题四十一]
前言
简单整理一下.net core 的跨域问题,这个以前也整理过比较详细的,故而在此简单整理一下。
正文
对跨域相对的就是同源,什么是同源呢?
协议相同(http/https)
主机(域名)相同
端口相同
如果全部满足这个三个条件就是同源,否者就是跨域。
跨域请求大概是下面这个过程:
从上面中看到,这些行为都是浏览器自己发起的检验,而不是我们的用户的行为。
那么就有两点东西就值得关注了。
- 假如a.com和b.com都是我的网站,现在我希望a.com访问b.com的东西。
这时候出现了浏览器出现报错,那么怎么办呢?b网站是否应该做什么呢?
- 安全问题,我就只希望a.com去访问b.com,其他网站不允许。
上文图片中显示了,浏览器会发送一个option请求判断是否允许请求,那么这个请求是什么呢?或者它包含什么呢?
首先这个请求是option,然后其头部包括。
origin 请求源
Access-Control-Request-Method 浏览器请求的方法,比如说post,get
Access-Control-Request-Headers 是指我们请求发起的请求头
那么我们的服务器需要响应:
Access-Control-Allow-Origin 是否允许跨域
Access-Control-Allow-Credentials 是否允许携带我们的认证信息,比如cookie信息
Access-Control-Expose-Headers 允许跨域请求的脚本访问到响应头的信息
Access-Control-Max-Age 有效跨域的时间,如果时间过了浏览器还有再次过来请求是否可以通过请求
Access-Control-Allow-Methods 允许的http方法
Access-Control-Allow-Headers 允许的http头
也就是说浏览器需要告诉服务器我们请求的信息是怎么样的,需要哪个域名来访问、请求的方法是什么,需要访问的请求的头部信息是什么。
现在假设我们拿到这些信息了,查看origin通过,看下请求Access-Control-Request-Method是post也通过,然后查看一下Access-Control-Request-Headers,比如这个值是X-Custom-token。
那么如果我们允许用户请求的header里面有X-Custom-token的话,那么在回复里面Access-Control-Allow-Methods就应该是:Access-Control-Allow-Methods:X-Custom-token。
Access-Control-Request-Headers 上面还是有点绕哈:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Request-Headers 直接看这个。
如上上述满足origin 和 Access-Control-Request-Method 的话,那么我在响应包的头部加入Access-Control-Allow-Origin:true,否则就是在Access-Control-Allow-Origin:false。
这里说明一下,如果options 请求Access-Control-Request-Headers里面的值,我们不同意的话,同样可以返回Access-Control-Allow-Origin 为true, Access-Control-Allow-Headers可以不返回,但是在请求的时候会出现用户自定义的header不会传输到我们的后台。
故而,如果Access-Control-Request-Headers 不满足的时候,个人认为设置可以Access-Control-Allow-Origin为true,这样表示是允许跨域的,但是自定义的一些header没有意义故而不传输。
同时Access-Control-Allow-Credentials:true,告诉浏览器请求的时候可以携带我们的认证信息,这个认证信息一般是Cookie。
Access-Control-Expose-Headers 这个是什么意思呢? 比如说a.com访问b.com,响应的头部有一个Good:aaa,也就是自定义头部。
那么我们就需要在Access-Control-Expose-Headers写Good这个头部信息(Access-Control-Expose-Headers:Good)运行对a.com的js访问到,否则js无法访问到自定义头部的。
Access-Control-Max-Age 就是跨域检测的有效期,就是过了这段时间还是要询问是否可以请求,因为到时候可能就变卦了。
这个还是很重要的。
Access-Control-Allow-Methods 和 Access-Control-Allow-Headers就是告诉浏览器,服务器对这个origin 允许的方法和头部,如果符合下次就不要再来问一次了。
这些属性都可以去查https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers。
下面介绍如何设置跨域请求:
配置服务:
services.AddCors(options =>
{
options.AddPolicy("api", builder =>
{
builder.WithOrigins("https://localhost:5000").AllowAnyHeader().AllowCredentials().WithExposedHeaders();
});
});
加入中间件:
app.UseCors();
具体的请求加入属性头:
[EnableCors("api")]
[HttpPost]
public IActionResult Pay()
{
return Content(User.FindFirst("name").Value+"买买买");
}
这里用postman测试一下检测部分的请求。
下一节
.net core 的缓存问题。
重新整理 .net core 实践篇————跨域问题四十一]的更多相关文章
- .net core实现跨域
什么是跨域在前面已经讲解过了,这里便不再讲解,直接上代码. 一.后台API接口 用.net core创建一个Web API项目负责给前端界面提供数据. 二.前端界面 建立两个MVC项目,模拟不同的ip ...
- .net core 的跨域
.net core 的跨域问题花了 我很长时间 接下来我简单的描述下解决过程 首先我在前端用jquery的ajax去调用自己的本地接口大致如下 $.ajax({ type:"POST&quo ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器
一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...
- Asp.Net Core WebAPI入门整理(三)跨域处理
一.Core WebAPI中的跨域处理 1.在使用WebAPI项目的时候基本上都会用到跨域处理 2.Core WebAPI的项目中自带了跨域Cors的处理,不需要单独添加程序包 3.使用方法简单 ...
- ASP.NET Core 启用跨域请求
本文翻译整理自:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1 一 .Cross-Orig ...
- 重新整理 .net core 实践篇————网关中的身份签名认证[三十七]
前言 简单整理一下网关中的jwt,jwt用于授权认证的,其实关于认证授权这块https://www.cnblogs.com/aoximin/p/12268520.html 这个链接的时候就已经写了,当 ...
- .Net Core Api 跨域配置
.Net Core 和Asp.Net 不同,不需要再去引用其他的跨域组件.创建项目时,就有了. 让接口实现跨域,需要配置两个地方. 一.Startup.cs 这里需要配置两个地方 public voi ...
随机推荐
- SSH实现免密登陆
SSH实现免密登陆配置 ssh实现免密码登录的配置过程,主要分为以下几个步骤: serverA生成密钥,包括私钥和公钥 serverA将公钥传到serverB上 serverA上配置serverB登陆 ...
- Linux进阶之软件管理
本节内容 一.rpm:管理linux软件程序的 特点:安装方便 不能解决依赖关系 1.安装软件: -i: -v: -h: rpm -ivh 包名 2.卸载软件 -e: 清楚 rpm -e 程序名 3. ...
- Linux进阶之使用Oh-My-Zsh打造炫酷终端
Oh My Zsh是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能.除了功能增强之外,还提供非常丰富的主题.使用Oh-My-Zsh打造酷炫Shell终端的步骤(Deepin系统): 原始终端: ...
- stm32中关于NVIC_SetVectorTable函数使用的疑惑与理解
[转载]2017年12月4日14:48:29 先描述下这几天碰到的一个奇怪的问题: 一个基于stm32的工程中使用到了IAP编程,其中boot空间预留长度为0x6100,实际boot的bin文件大小为 ...
- [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)
39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...
- Go语言介绍(背景、特点)
一.go语言的背景 Go是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go(又称 Golang)是 Google 的 Rob Pike(罗勃.派克),Ken Thompson(肯· ...
- 腾讯 angel 3.0:高效处理模型
腾讯 angel 3.0:高效处理模型 紧跟华为宣布新的 AI 框架开源的消息,腾讯又带来了全新的全栈机器学习平台 angel3.0.新版本功能特性覆盖了机器学习的各个阶段,包括:特征工程.模型训练. ...
- 激光雷达数据到云cloud
激光雷达数据到云cloud 在美国地质调查局的3D提升计划(3DEP)被激发到一个新的方式可用性宣布从3DEP仓库的访问和处理激光雷达点云数据. 3DEP一直在美国使用光检测和测距(激光)技术获取三维 ...
- 功率半导体碳化硅(SiC)技术
功率半导体碳化硅(SiC)技术 Silicon Carbide Adoption Enters Next Phase 碳化硅(SiC)技术的需求继续增长,这种技术可以最大限度地提高当今电力系统的效率, ...
- springmvc自定义的拦截器以及拦截器的配置
一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...