如何處理跨域問題
阿新 • • 發佈:2022-03-20
為什麼會有跨域問題呢?
瀏覽器安全性可防止網頁向不處理網頁的域傳送請求。 此限制稱為同域策略。 同域策略可防止惡意站點從另一站點讀取敏感資料。 有時,你可能希望允許其他網站向自己的應用發出跨源請求。
怎麼處理跨域問題
跨域資源共享CORS
可以通過跨域資源共享CORS機制,新增了一組 HTTP 首部欄位,允許伺服器宣告哪些源站通過瀏覽器有許可權訪問哪些資源
使用 Origin
和 Access-Control-Allow-Origin
就能完成最簡單的訪問控制
以下是瀏覽器傳送給伺服器的請求報文:
GET /resources/public-data/ HTTP/1.1 Host: bar.other User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Connection: keep-alive Origin: https://foo.example
請求首部欄位 Origin
表明該請求來源於 http://foo.example
。
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml
[XML Data]
本例中,服務端返回的 Access-Control-Allow-Origin: *
表明,該資源可以被 任意
預檢請求
除了上述簡單請求外,瀏覽器必須首先使用 OPTIONS
方法發起一個預檢請求
簡單介紹下,簡單請求需要滿足下面所有條件:
-
使用
GET
、HEAD
、POST
方法 -
沒有使用者自己設定的首部欄位
-
Content-Type
的值僅限於下列三者之一:text/plain
multipart/form-data
application/x-www-form-urlencoded
預檢請求流程
預檢請求和憑據
CORS 預檢請求不能包含憑據。預檢請求的 響應 必須指定 Access-Control-Allow-Credentials: true
來表明可以攜帶憑據(通常是 Cookie
當響應的是附帶身份憑證的請求時,服務端 必須 明確 Access-Control-Allow-Origin
的值,而不能使用萬用字元“*
”。
在 ASP.NET Core 中啟用跨源請求 (CORS)
public class Startup
{
readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors(MyAllowSpecificOrigins);
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}