重新整理 .net core 實踐篇————跨域問題四十一]

敖毛毛發表於2021-07-11

前言

簡單整理一下.net core 的跨域問題,這個以前也整理過比較詳細的,故而在此簡單整理一下。

正文

對跨域相對的就是同源,什麼是同源呢?

  1. 協議相同(http/https)

  2. 主機(域名)相同

  3. 埠相同

如果全部滿足這個三個條件就是同源,否者就是跨域。

跨域請求大概是下面這個過程:

從上面中看到,這些行為都是瀏覽器自己發起的檢驗,而不是我們的使用者的行為。

那麼就有兩點東西就值得關注了。

  1. 假如a.com和b.com都是我的網站,現在我希望a.com訪問b.com的東西。

這時候出現了瀏覽器出現報錯,那麼怎麼辦呢?b網站是否應該做什麼呢?

  1. 安全問題,我就只希望a.com去訪問b.com,其他網站不允許。

上文圖片中顯示了,瀏覽器會傳送一個options請求判斷是否允許請求,那麼這個請求是什麼呢?或者它包含什麼呢?

首先這個請求是options,然後其頭部包括。

  1. origin 請求源

  2. Access-Control-Request-Method 瀏覽器請求的方法,比如說post,get

  3. Access-Control-Request-Headers 是指我們請求發起的請求頭

那麼我們的伺服器需要響應:

  1. Access-Control-Allow-Origin 是否允許跨域

  2. Access-Control-Allow-Credentials 是否允許攜帶我們的認證資訊,比如cookie資訊

  3. Access-Control-Expose-Headers 允許跨域請求的指令碼訪問到響應頭的資訊

  4. Access-Control-Max-Age 有效跨域的時間,如果時間過了瀏覽器還有再次過來請求是否可以通過請求

  5. Access-Control-Allow-Methods 允許的http方法

  6. 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 的快取問題。

相關文章