.Net Core Cors中间件解析

同源策略和资源跨域共享

 1、同源策略

   同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。

 1.1、目的

   主要是为了保证用户信息的安全,防止网站窃取用户数据。假如没有同源策略,可能就会有下面这种情况的发生。用户访问两个网站A/B,并登录了A网站,A网站会在计算机本地存储Cookie或者Token等等,在访问B网站的时候,B网站就可以访问这些本地的存储信息,B网站可以使用用户的Cookie去登录A网站,那这样用户信息就被泄露了。

 1.2、限制范围   

  • Cookie、LocalStorage和indexDB无法访问(只有同源的网页才能共享Cookie)

  • DOM无法获得(父窗口和子窗口的地址是同源的才能获取子窗口的信息)

  • AJAX请求不能被发送(AJAX请求只能发送给同源的网址)

  要知道一点,这些限制其实都是浏览器做的限制。

 2、跨域资源共享

  跨域资源共享跟同源策略相反。在整个跨域通信过程中,浏览器会自动识别此次请求是否跨域,一旦发现跨域,就自动添加请求头信息(如Origin)或者自动发送一次请求方式为option的预请求。浏览器将CORS请求分为两类:简单请求和非简单请求。

 2.1、简单请求

  当浏览器的请求方式是Head、Get或者Post,并且HTTP的头信息中不会超出以下字段:

  • Accept

  • Accept-Language

  • Content-Language

  • Origin

时,浏览器会将该请求定义为简单请求,否则就是非简单请求。当浏览器判断为简单请求后,浏览器会自动再请求报文头中加上Origin字段,表明此次请求来自的地址(协议+域名+端口)。然后服务器需要去判断是否接受这个来源的请求。如果允许服务器端返回的头部中需要有Access-Control-Allow-Origin,其值为请求时Origin字段的值或*(表示接受任意源的请求)。请求头中还会有Access-Control-Allow-Methods表示服务器允许的跨域请求的方式。Access-Control-Allow-Headers表示请求头中允许出现的字段。

 2.2、 非简单请求

   当浏览器判断为非简单请求后,会发送两次请求,首先浏览器会自动发送一个请求方式为options的请求,并在请求头中

  • 加上Access-Control-Request-Method表示下次请求的方法,

  • 加上Origin表明来源,

  • 加上Access-Control-Request-Headers表示下次请求的请求头中额外的字段。

     服务器收到请求后,需要获取这三个请求头中的值,并进行判断,确认是否允许进行跨域。如果服务器返回的请求头中没有任何CORS相关的请求头信息,浏览器会认为不通过预检,也不会进行第二次请求。

     服务器如果接受跨域并验证通过了options的请求,会返回Access-Control-Allow-Origin(表明允许跨域请求的源)、Access-Control-Allow-Methods(允许跨域请求的请求方式)、Access-Control-Allow-Headers(允许请求头中包含的额外字段)。然后浏览器才会发送真正的请求。                  

640?wx_fmt=png

                                              (第一次options请求)
640?wx_fmt=png

                                           (第二次请求)

二、服务端实现CORS

  在.Net Core Web Api中使用很简单,首先安装包Microsoft.AspNet.WebApi.Cors,在StartUp中添加下面两句

640?wx_fmt=png

在使用的时候只需要在Controller或者Action中加上特性[EnableCors("CorsTest")]

640?wx_fmt=png

现在服务端已经配置好了,现在需要通过前端跨域请求

640?wx_fmt=png

测试结果如下图:

640?wx_fmt=png

                          (options请求)

640?wx_fmt=png

(第二次请求)

 上面配置允许所有的地址请求这个接口,也可以单独配置某个地址。

services.AddCors(options => options.AddPolicy("CorsTest", p => p.WithOrigins("http://localhost:8089").AllowAnyHeader().AllowAnyMethod()));

 三、解析Cors源码

  打开CORS源码,主要的是CorsMiddleware、CorsOptions、CorsPolicy、CorsPolicyBuilder、CorsResult、CorsService这几个类。

  • CorsPolicy:就是我们在Startup中的配置,如允许哪些域名可以跨域请求,允许哪些跨域请求方式,允许哪些额外的请求头,每个配置对应一个名称。

       services.AddCors(options => options.AddPolicy("CorsTest", p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
  • CorsOptions:中包含一个字典IDictionary<string, CorsPolicy> PolicyMap,一个项目可能有过个Cors配置,所以这个CorsOptions就是通过配置名称管理这些配置的。

  • CorsPolicyBuilder:通过它来构造CorsPolicy。

  • CorsResult:是验证跨域过程得到的结果。如在第一次Options请求时,客户端发送了Origi:http://localhost:8089,服务器会返回Access-Control-Allow-Origin:http://localhost:8089,服务器验证http://localhost:8089这个域名是否允许跨域,如果允许就将“http://localhost:8089”这个值存储到CorsResult的AllowedHeaders中,在请求(第一次请求)返回的时候将这些加到HTTP请求头中。

  • CorsMiddleware:Cors中间件类,主要方法就是Invoke,每次HTTP请求都会调用这个方法。

640?wx_fmt=png

相对来说Cors源码还是比较简单的,很容易看懂。可以自己写一个项目,然后挂上源码单步调试。

原文地址:https://www.cnblogs.com/MicroHeart/p/9298759.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ 3513: [MUTC2013]idiots [FFT]

统计每种长度的木棒数量&#xff0c;先计算出两根棒子能构成的长度&#xff0c;想到卷积。1.拿这个序列卷积自己 2.计算重算的部分&#xff0c;首先是一条边自己和自己的这种情况&#xff0c;另一种是(i,j)和(j,i)这种形式。第一种&#xff0c;可以枚举读入的木棒长度&#xff…

【暴力】I Liked Matrix!

I Liked Matrix! 题目大意&#xff1a; 有一个矩阵&#xff0c;求出某一些子矩阵内最大的数 原题&#xff1a; 题目描述 给定一个 n ∗ m 的矩阵 A&#xff0c;对其进行 q 次询问&#xff1a;以 (x1, y1) 为左上角&#xff0c;(x2, y2) 为右下角的子矩 阵中&#xff0c;所…

jzoj6805-NOIP2020.9.26模拟speike【扫描线】

正题 题目大意 一个平面上&#xff0c;起点是(0,0)(0,0)(0,0)&#xff0c;终点是(0,t)(0,t)(0,t)。有nnn个没有共同面积的矩形障碍物&#xff0c;对于每个障碍物不可以从内部穿过而可以从边上走过。求最短路。 解题思路 因为没有共同面积所以横坐标不会变小。并且只有在边界处…

【dfs】I Like Matrix!

I Like Matrix! 题目大意&#xff1a; 有一个矩阵&#xff0c;还有一些走法&#xff0c;从1,1开始可以走到多少个位置 原题&#xff1a; 题目描述 给定 k 种移动方式&#xff1a;从 (i, j) 移动到 (i xk, j yk)&#xff08;xk, yk > 0&#xff09;。询问在一个 n ∗ …

Full_of_Boys训练3总结

题目来源: 2016-2017 ACM-ICPC Pacific Northwest Regional Contest E.Enclosure 先计算出内外两个凸包&#xff0c;枚举大凸包上的点&#xff0c;在小凸包上找到两个切点。计算面积时&#xff0c;就相当于删掉几条原先的边&#xff0c;加上一个新的三角形。同时&#xff0c;可…

P3188-[HNOI2007]梦幻岛宝珠【背包】

正题 题目链接:https://www.luogu.com.cn/problem/P3188 题目大意 nnn个物品&#xff0c;大小为WWW的背包。 每个物品的大小可以表示为wiai2biw_ia_i2^{b_i}wi​ai​2bi​&#xff0c;有价值viv_ivi​。 求选择一些物品不超过背包的大小使得价值最大。 解题思路 设先计算bi…

【DP】I Will Like Matrix!

I Will Like Matrix! 题目大意&#xff1a; 有一个01矩阵&#xff0c;a[i][j1]a[i][j1]a[i][j1]和a[i1][j]a[i1][j]a[i1][j]必须大于a[i][j]a[i][j]a[i][j],问有多少种填法 原题&#xff1a; 题目描述 在一个 n ∗ m 的矩阵 A 的所有位置中分别填入 0 或 1&#xff0c;要求…

用Way.EntityDB进行Entity Framework Core数据库建模

Way.EntityDB是一个基于EF Core的数据层框架&#xff0c;它取消了EF Core的Migration机制&#xff0c;因为Migration并不是通用的&#xff0c;比如说sql server生成的migration&#xff0c;如果换成sqlite&#xff0c;运行时会报错的&#xff0c;也就是数据库不能更换。Way.Ent…

AT4513-[AGC030D]InversionSum【dp】

正题 题目链接:https://atcoder.jp/contests/agc030/tasks/agc030_d 题目大意 nnn个数&#xff0c;ppp次操作可以选择操作或者不操作&#xff0c;询问所有情况下逆序对的总和。 解题思路 转换成期望的问题&#xff0c;设fi,jf_{i,j}fi,j​表示所有情况下ai<aja_i<a_jai…

【dfs】【模拟】【树】I Like Matrix Forever!

I Like Matrix Forever! 题目大意&#xff1a; 有一个01矩阵&#xff0c;有一些操作&#xff1a;反转一个位置的数&#xff0c;反转一行的数&#xff0c;反转一列的数&#xff0c;回到第i次操作&#xff0c;每一次操作还要输出1的个数 原题&#xff1a; 题目描述 对一个 n…

Full_of_Boys训练4总结

题目来源&#xff1a;2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017) A.Cakey McCakeFace #include <bits/stdc.h> #define pb(x) push_back(x) typedef long long ll; const int maxn 20007; using namespace std; int n,m; ll …

.NET Core开发日志——Runtime IDentifier

.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台&#xff0c;所以有时遇上出乎意料的事情也纯属正常情况。这时只需点耐心&#xff0c;多查查资料&#xff0c;努力找到原因&#xff0c;也未尝不是件有意义的体验。比如当建完一个最简单的控制台应用程序&#xff1a;d…

P3723-[AH2017/HNOI2017]礼物【FFT】

正题 题目链接:https://www.luogu.com.cn/problem/P3723 题目大意 两个长度为nnn的序列xxx和yyy&#xff0c;可以旋转序列xxx之后让一个序列的所有数加上一个非负整数ccc。 要求最小化∑i1n(xi−yi)2\sum_{i1}^n(x_i-y_i)^2i1∑n​(xi​−yi​)2 解题思路 其实就是要求最小…

初一模拟赛总结(5.11)

成绩&#xff1a; rank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4T5T5T5333lyflyflyf420420420100100100100100100100100100100100100202020444hkyhkyhky400400400100100100100100100100100100100100100000444fyfyfy40040…

Full_of_Boys训练5总结

题目来源&#xff1a;2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest A. Advertising Strategy 贪心方法&#xff1a;把一部分k放到初始值&#xff0c;剩下一部分&#xff0c;等到最后用。然后&#xff0c;枚举第一部分放多少即可。 #include <bits/stdc.h> typ…

C#语法——await与async的正确打开方式

C#5.0推出了新语法&#xff0c;await与async&#xff0c;但相信大家还是很少使用它们。关于await与async有很多文章讲解&#xff0c;但有没有这样一种感觉&#xff0c;你看完后&#xff0c;总感觉这东西很不错&#xff0c;但用的时候&#xff0c;总是想不起来&#xff0c;或者不…

jzoj1753-锻炼身体【单调队列】

正题 题目大意 n∗mn*mn∗m的有障碍物的网格&#xff0c;开始在(xs,ys)(x_s,y_s)(xs​,ys​)。有kkk段时间网格会倾斜&#xff0c;对于倾斜的方向可以选择移动或者不移动&#xff0c;求最长移动距离。 解题思路 因为每段时间方向唯一&#xff0c;所以我们对于每一列或每一行分…

【并查集】打击犯罪(ssl 2342)

打击犯罪 ssl 2342 题目大意&#xff1a; 有n个人某些人之间有连接&#xff08;连接成一个团伙&#xff09;&#xff0c;现在要最大的团伙人数不大于n/2&#xff0c;要最少要删掉几个人&#xff08;要按顺序删&#xff09; 原题&#xff1a; 题目描述&#xff1a; 某个地…

Full_of_Boys训练6总结

题目来源&#xff1a;2014-2015 ACM-ICPC, Asia Xian Regional Contest F. Color 第一道二项式反演。。膜题解: https://www.cnblogs.com/wmrv587/p/6681953.html #include<bits/stdc.h> typedef long long ll; const ll mod 1e9 7; using namespace std; ll q_pow(ll …

好代码是管出来的——.Net Core集成测试与数据驱动测试

软件的单元测试关注是的软件最小可执行单元是否能够正常执行&#xff0c;但是软件是由一个个最小执行单元组成的集合体&#xff0c;单元与单元之间存在着种种依赖或联系&#xff0c;所以在软件开发时仅仅确保最小单元的正确往往是不够的&#xff0c;为了保证软件能够正确运行&a…