深入讲解 网络核心Cors中间件
同源策略和跨域资源共享
1、同源策略
同源策略,是网景公司提出的著名安全策略。现在所有支持JavaScript的浏览器都将使用这种策略。同源是指相同的域名、协议和端口。
1.1.目的
主要是为了保证用户信息的安全,防止网站窃取用户数据。如果没有相应的策略,可能会出现以下情况。用户访问A/B两个网站,登录A网站。网站将在计算机本地存储cookies或令牌。在访问B网站时,B网站可以访问这些本地存储的信息,B网站可以使用用户的cookies登录A网站,从而泄露用户信息。
1.2.限制范围
cookie、LocalStorage和indexDB不能访问(只有同源网页可以共享cookie);无法获取DOM(父窗口和子窗口的地址同源获取子窗口的信息);AJAX请求无法发送(AJAX请求只能发送到同源网址)。需要注意的是,这些限制实际上是由浏览器做出的。
2.跨域资源共享
跨域资源共享与同源策略相反。在跨域通信的整个过程中,浏览器会自动识别请求是否跨域。一旦找到跨域,它将自动添加请求头信息(如Origin)或自动发送带有请求模式选项的预请求。浏览器将CORS请求分为两类:简单请求和非简单请求。
2.1.简单请求
当浏览器的请求模式为Head、Get或Post时,HTTP的头信息不会超过以下字段:
当接受接受语言内容语言来源时,浏览器会将请求定义为简单请求,否则将是非简单请求。当浏览器判断这是一个简单的请求时,浏览器会自动将Origin字段添加到请求头中,以指示请求来自的地址(协议域名端口)。然后服务器需要决定是否接受来自这个源的请求。如果服务器返回的头中需要访问控制允许源,则其值是请求时源字段的值或*(表示接受来自任何源的请求)。在请求头中,还将有访问控制允许方法,指示服务器允许的跨域请求的方式。访问控制允许标头指示请求标头中允许的字段。
2.2.非简单请求
当浏览器判断不是简单的请求时,会发送两个请求。首先,浏览器会自动发送带有请求模式选项的请求,并且在请求头中,
添加访问控制请求方法以指示下一个请求的方法,添加来源以指示来源,添加访问控制请求标题以指示下一个请求的请求标题中的附加字段。服务器收到请求后,需要获取这三个请求头中的值,并做出判断,确认是否允许跨域。如果服务器返回的请求头中没有与CORS相关的请求头信息,浏览器会认为预览失败,不会再进行第二次请求。
如果服务器接受跨域请求并验证选项已通过,它将返回访问控制允许源(指示允许跨域请求的源)、访问控制允许方法(允许跨域请求的请求模式)和访问控制允许头(允许请求头中包含的额外字段)。然后浏览器会发送真正的请求。
(第一个选项请求)
(第二次请求)
第二,服务器实现CORS
在中使用非常简单。网络核心网络应用编程接口。首先,安装微软。并在StartUp中添加以下两句话
public void ConfigureServices(IServiceCollection services){ services .AddMvc();//添加科尔,并配置CorsPolicy服务添加选项(选项=选项.AddPolicy('CorsTest ',p=p . AllowAnyOrigin().AllowAnyHeader().allowy method()));}公共void Configure(IApplicationBuilder应用程序,IHostingEnvironment env,ILoggerFactory logger factory){ if(env .IsDevelopment()) { app .usedeveloper异常页();} //注意UseCors()要在UseMvc()之前应用程序.UseCors(' CorStest ');应用程序.UseMvc();}在使用的时候只需要在控制器或者行动中加上特性[EnableCors('CorsTest')]
[EnableCors('CorsTest')]公共类值控制器:控制器{私有I logger values Controller _ logger;公共值控制器(ilogagevalues控制器记录器){ _ logger=logger}[HttpGet]public ienumerablesting Get(){ 0返回新字符串[] { 'value1 ',' value 2 ' };} }现在服务端已经配置好了,现在需要通过前端跨域请求
htmlhead测试/流浆池测试/body/html脚本src=' http :https://代码。jquery。com/jquery-3。3 .1 .量滴js '/script脚本类型=' text/JavaScript ' $(function(){ $).ajax({ type: 'get ',URL : ' http://localhost :7000/API/values ',beforeSend:函数(请求){//在请求报文头中加入批准目的是让请求为非简单请求request.setRequestHeader(')授权','承载071899 a00d 4d 5c 1b 4c 41 a6b 0211 b 9399’);},成功:函数(结果){ alert(结果);} },' JSON ');});/script测试结果如下图:
(选项请求)
(第二次请求)
上面配置允许所有的地址请求这个接口,也可以单独配置某个地址。
服务添加选项(选项=选项.AddPolicy('CorsTest ',p=p . with Originals(' http://localhost :8089 ').AllowAnyHeader().allowy method()));三、解析克-奥二氏分级量表源码
打开克-奥二氏分级量表源码,主要的是中间件、组件、策略、策略构建器、结果、服务这几个类。
政策:就是我们在启动中的配置,如允许哪些域名可以跨域请求,允许哪些跨域请求方式,允许哪些额外的请求头,每个配置对应一个名称服务添加选项(选项=选项.AddPolicy('CorsTest ',p=p . AllowAnyOrigin().AllowAnyHeader().allowy method()));更正:中包含一个字典IDictionarystring,CorsPolicy PolicyMap,一个项目可能有过个克-奥二氏分级量表配置,所以这个相关服务就是通过配置名称管理这些配置的CorsPolicyBuilder:通过它来构造CorsPolicy。CorsResult:是验证跨域过程得到的结果。如在第一次选择请求时,客户端发送了Origi:http://localhost:8089,服务器会返回访问控制允许来源:http://localhost:8089,服务器验证http://localhost:8089这个域名是否允许跨域,如果允许就将" http://localhost:8089 "这个值存储到CorsResult的允许标题中,在请求(第一次请求)返回的时候将这些加到超文本传送协议请求头中中间件:Cors中间件类,主要方法就是调用,每次超文本传送协议请求都会调用这个方法公共异步任务调用(HttpContext上下文){//判断超文本传送协议请求头是否有起源,由此判断是不是跨域请求如果(上下文。请求。标题。包含密钥(附件Origin)) { var corsPolicy=_policy?await _ corsPolicyProvider?getpolicysync(context,_ corsPolicyName);if (corsPolicy!=null){ var accesscontrolrequest方法=context .请求。标题[附件accesscontrolrequest方法];//如果是跨域请求判断是不是第一次选择请求如果(字符串等于(上下文。请求。方法,常量PreflightHttpMethod,StringComparison .普通案例)!字符串值.IsNullOrEmpty(accessControlRequestMethod)){//判断是否允许当前请求跨域,根据上下文对象的内容和克-奥二氏分级量表配置得到CorsResult,然后将CorsResult的内容添加到请求头中(看下面详细解释)apply char readers(context,CorspoLicy);语境。响应。状态代码=状态代码状态204无内容;返回;} else {//执行第二次非选择请求语境回应。OnStarting(state={ var(httpContext,policy)=(TupleHttpContext,CorsPolicy)state;请尝试{ applycarshreaders(httpContext,policy);} catch(异常异常){ _logger .FailedToSetCorsHeaders(异常);}返回任务。完成任务;},元组。创建(上下文,CorspoLicy));} } } await _ next(context);} private void applycarshreaders(HttpContext上下文,CorsPolicy corsPolicy) {//通过超文本传送协议上下文请求的数据和克-奥二氏分级量表配置得到CorsResult如在第一次选择请求时,客户端发送了来源:http://localhost:8089,访问控制-研究-方法:获取服务器会返回访问控制-允许-来源:http://localhost:8089,访问控制-允许-方法:GET服务器验证http://localhost:8089这个域名以得到请求方式是否允许跨域,如果允许就将" http://localhost:8089 "这个值存储到CorsResult的允许标题中将"获得"存储到CorsResult的允许的方法中var corsResult=_corsService .EvaluatePolicy(上下文,corsPolicy);//将CorsResult中的值添加到相应头中的,返回到客户端_corsService .ApplyResult(corsResult,context .回应);}相对来说克-奥二氏分级量表源码还是比较简单的,很容易看懂。可以自己写一个项目,然后挂上源码单步调试。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
版权声明:深入讲解 网络核心Cors中间件是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。