1. 程式人生 > 其它 >如何處理跨域問題

如何處理跨域問題

為什麼會有跨域問題呢?

瀏覽器安全性可防止網頁向不處理網頁的域傳送請求。 此限制稱為同域策略。 同域策略可防止惡意站點從另一站點讀取敏感資料。 有時,你可能希望允許其他網站向自己的應用發出跨源請求。

怎麼處理跨域問題

跨域資源共享CORS

可以通過跨域資源共享CORS機制,新增了一組 HTTP 首部欄位,允許伺服器宣告哪些源站通過瀏覽器有許可權訪問哪些資源

使用 OriginAccess-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 方法發起一個預檢請求

簡單介紹下,簡單請求需要滿足下面所有條件:

  • 使用 GETHEADPOST方法

  • 沒有使用者自己設定的首部欄位

  • Content-Type的值僅限於下列三者之一:

    text/plain

    multipart/form-data

    application/x-www-form-urlencoded

預檢請求流程

預檢請求和憑據

CORS 預檢請求不能包含憑據。預檢請求的 響應 必須指定 Access-Control-Allow-Credentials: true 來表明可以攜帶憑據(通常是 Cookie

)進行實際的請求。 一些企業認證服務要求在預檢請求時傳送 TLS 客戶端證書。

當響應的是附帶身份憑證的請求時,服務端 必須 明確 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();
        });
    }
}