怎么實(shí)現(xiàn).NetCoreCors中間件解析

怎么實(shí)現(xiàn).Net Core Cors中間件解析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、安居網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為安居等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

同源策略和資源跨域共享

 1、同源策略

同源策略,它是由Netscape提出的一個(gè)著名的安全策略?,F(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。所謂同源是指,域名,協(xié)議,端口相同。

 1.1、目的

主要是為了保證用戶信息的安全,防止網(wǎng)站竊取用戶數(shù)據(jù)。假如沒有同源策略,可能就會(huì)有下面這種情況的發(fā)生。用戶訪問兩個(gè)網(wǎng)站A/B,并登錄了A網(wǎng)站,A網(wǎng)站會(huì)在計(jì)算機(jī)本地存儲(chǔ)Cookie或者Token等等,在訪問B網(wǎng)站的時(shí)候,B網(wǎng)站就可以訪問這些本地的存儲(chǔ)信息,B網(wǎng)站可以使用用戶的Cookie去登錄A網(wǎng)站,那這樣用戶信息就被泄露了。

 1.2、限制范圍   
  • Cookie、LocalStorage和indexDB無法訪問(只有同源的網(wǎng)頁才能共享Cookie)

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

  • AJAX請(qǐng)求不能被發(fā)送(AJAX請(qǐng)求只能發(fā)送給同源的網(wǎng)址)

要知道一點(diǎn),這些限制其實(shí)都是瀏覽器做的限制。

 2、跨域資源共享

跨域資源共享跟同源策略相反。在整個(gè)跨域通信過程中,瀏覽器會(huì)自動(dòng)識(shí)別此次請(qǐng)求是否跨域,一旦發(fā)現(xiàn)跨域,就自動(dòng)添加請(qǐng)求頭信息(如Origin)或者自動(dòng)發(fā)送一次請(qǐng)求方式為option的預(yù)請(qǐng)求。瀏覽器將CORS請(qǐng)求分為兩類:簡(jiǎn)單請(qǐng)求和非簡(jiǎn)單請(qǐng)求。

 2.1、簡(jiǎn)單請(qǐng)求

當(dāng)瀏覽器的請(qǐng)求方式是Head、Get或者Post,并且HTTP的頭信息中不會(huì)超出以下字段:

  • Accept

  • Accept-Language

  • Content-Language

  • Origin

時(shí),瀏覽器會(huì)將該請(qǐng)求定義為簡(jiǎn)單請(qǐng)求,否則就是非簡(jiǎn)單請(qǐng)求。當(dāng)瀏覽器判斷為簡(jiǎn)單請(qǐng)求后,瀏覽器會(huì)自動(dòng)再請(qǐng)求報(bào)文頭中加上Origin字段,表明此次請(qǐng)求來自的地址(協(xié)議+域名+端口)。然后服務(wù)器需要去判斷是否接受這個(gè)來源的請(qǐng)求。如果允許服務(wù)器端返回的頭部中需要有Access-Control-Allow-Origin,其值為請(qǐng)求時(shí)Origin字段的值或*(表示接受任意源的請(qǐng)求)。請(qǐng)求頭中還會(huì)有Access-Control-Allow-Methods表示服務(wù)器允許的跨域請(qǐng)求的方式。Access-Control-Allow-Headers表示請(qǐng)求頭中允許出現(xiàn)的字段。

 2.2、 非簡(jiǎn)單請(qǐng)求

當(dāng)瀏覽器判斷為非簡(jiǎn)單請(qǐng)求后,會(huì)發(fā)送兩次請(qǐng)求,首先瀏覽器會(huì)自動(dòng)發(fā)送一個(gè)請(qǐng)求方式為options的請(qǐng)求,并在請(qǐng)求頭中

  • 加上Access-Control-Request-Method表示下次請(qǐng)求的方法,

  • 加上Origin表明來源,

  • 加上Access-Control-Request-Headers表示下次請(qǐng)求的請(qǐng)求頭中額外的字段。

   服務(wù)器收到請(qǐng)求后,需要獲取這三個(gè)請(qǐng)求頭中的值,并進(jìn)行判斷,確認(rèn)是否允許進(jìn)行跨域。如果服務(wù)器返回的請(qǐng)求頭中沒有任何CORS相關(guān)的請(qǐng)求頭信息,瀏覽器會(huì)認(rèn)為不通過預(yù)檢,也不會(huì)進(jìn)行第二次請(qǐng)求。

   服務(wù)器如果接受跨域并驗(yàn)證通過了options的請(qǐng)求,會(huì)返回Access-Control-Allow-Origin(表明允許跨域請(qǐng)求的源)、Access-Control-Allow-Methods(允許跨域請(qǐng)求的請(qǐng)求方式)、Access-Control-Allow-Headers(允許請(qǐng)求頭中包含的額外字段)。然后瀏覽器才會(huì)發(fā)送真正的請(qǐng)求?!               ?/p>

怎么實(shí)現(xiàn).Net Core Cors中間件解析

                                   (第一次options請(qǐng)求)
怎么實(shí)現(xiàn).Net Core Cors中間件解析

(第二次請(qǐng)求)

二、服務(wù)端實(shí)現(xiàn)CORS

在.Net Core Web Api中使用很簡(jiǎn)單,首先安裝包Microsoft.AspNet.WebApi.Cors,在StartUp中添加下面兩句

怎么實(shí)現(xiàn).Net Core Cors中間件解析

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

怎么實(shí)現(xiàn).Net Core Cors中間件解析

現(xiàn)在服務(wù)端已經(jīng)配置好了,現(xiàn)在需要通過前端跨域請(qǐng)求

怎么實(shí)現(xiàn).Net Core Cors中間件解析

測(cè)試結(jié)果如下圖:

怎么實(shí)現(xiàn).Net Core Cors中間件解析

               (options請(qǐng)求)

怎么實(shí)現(xiàn).Net Core Cors中間件解析

(第二次請(qǐng)求)

 上面配置允許所有的地址請(qǐng)求這個(gè)接口,也可以單獨(dú)配置某個(gè)地址。

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

 三、解析Cors源碼

打開CORS源碼,主要的是CorsMiddleware、CorsOptions、CorsPolicy、CorsPolicyBuilder、CorsResult、CorsService這幾個(gè)類。

  • CorsPolicy:就是我們?cè)赟tartup中的配置,如允許哪些域名可以跨域請(qǐng)求,允許哪些跨域請(qǐng)求方式,允許哪些額外的請(qǐng)求頭,每個(gè)配置對(duì)應(yīng)一個(gè)名稱。

services.AddCors(options => options.AddPolicy("CorsTest", p => p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
  • CorsOptions:中包含一個(gè)字典IDictionary<string, CorsPolicy> PolicyMap,一個(gè)項(xiàng)目可能有過個(gè)Cors配置,所以這個(gè)CorsOptions就是通過配置名稱管理這些配置的。

  • CorsPolicyBuilder:通過它來構(gòu)造CorsPolicy。

  • CorsResult:是驗(yàn)證跨域過程得到的結(jié)果。如在第一次Options請(qǐng)求時(shí),客戶端發(fā)送了Origi:http://localhost:8089,服務(wù)器會(huì)返回Access-Control-Allow-Origin:http://localhost:8089,服務(wù)器驗(yàn)證http://localhost:8089這個(gè)域名是否允許跨域,如果允許就將“http://localhost:8089”這個(gè)值存儲(chǔ)到CorsResult的AllowedHeaders中,在請(qǐng)求(第一次請(qǐng)求)返回的時(shí)候?qū)⑦@些加到HTTP請(qǐng)求頭中。

  • CorsMiddleware:Cors中間件類,主要方法就是Invoke,每次HTTP請(qǐng)求都會(huì)調(diào)用這個(gè)方法。

怎么實(shí)現(xiàn).Net Core Cors中間件解析

相對(duì)來說Cors源碼還是比較簡(jiǎn)單的,很容易看懂。可以自己寫一個(gè)項(xiàng)目,然后掛上源碼單步調(diào)試。

看完上述內(nèi)容,你們掌握怎么實(shí)現(xiàn).Net Core Cors中間件解析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前標(biāo)題:怎么實(shí)現(xiàn).NetCoreCors中間件解析
轉(zhuǎn)載來于:http://muchs.cn/article44/jepche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、服務(wù)器托管、搜索引擎優(yōu)化、網(wǎng)站收錄、網(wǎng)站策劃、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)