Använda Azure CDN med CORS

Vad är CORS?

CORS (resursdelning mellan ursprung) är en HTTP-funktion som gör att ett webbprogram som körs under en domän kan komma åt resurser i en annan domän. För att minska risken för skriptattacker mellan webbplatser implementerar alla moderna webbläsare en säkerhetsbegränsning som kallas principen för samma ursprung. Den här begränsningen förhindrar att en webbsida anropar API:er i en annan domän. CORS är ett säkert sätt att tillåta att ett ursprung (ursprungsdomänen) anropar API:er i ett annat ursprung.

Så här fungerar det

Det finns två typer av CORS-begäranden, enkla begäranden och komplexa begäranden.

För enkla begäranden:

  1. Webbläsaren skickar CORS-begäran med en extra origin HTTP-begäranderubrik. Värdet för begärandehuvudet är det ursprung som hanterade den överordnade sidan, som definieras som en kombination av protokoll, domän och port. När en sida från HTTPS://www.contoso.com försök att komma åt en användares data i fabrikam.com ursprung skickas följande begärandehuvud till fabrikam.com:

    Origin: https://www.contoso.com

  2. Servern kan svara med någon av följande rubriker:

    • Ett Access-Control-Allow-Origin-huvud i svaret som anger vilken ursprungsplats som tillåts. Till exempel:

      Access-Control-Allow-Origin: https://www.contoso.com

    • En HTTP-felkod, till exempel 403 om servern inte tillåter begäran om korsande ursprung efter att ha kontrollerat ursprungsrubriken

    • En Access-Control-Allow-Origin-rubrik med ett jokertecken som tillåter alla ursprung:

      Access-Control-Allow-Origin: *

För komplexa begäranden:

En komplex begäran är en CORS-begäran där webbläsaren krävs för att skicka en förhandsbegäran (dvs. en preliminär avsökning) innan den faktiska CORS-begäran skickas. Preflight-begäran ber om serverbehörighet om den ursprungliga CORS-begäran kan fortsätta och är en OPTIONS begäran till samma URL.

Dricks

Mer information om CORS-flöden och vanliga fallgropar finns i guiden till CORS för REST-API:er.

Scenarier med jokertecken eller enskilt ursprung

CORS på Azure CDN fungerar automatiskt utan extra konfigurationer när huvudet Access-Control-Allow-Origin är inställt på jokertecken (*) eller ett enda ursprung. CDN cachelagrade det första svaret och efterföljande begäranden använder samma rubrik.

Om begäranden redan har gjorts till CDN innan CORS har angetts för ditt ursprung måste du rensa innehåll på slutpunktsinnehållet för att läsa in innehållet igen med huvudet Access-Control-Allow-Origin .

Scenarier med flera ursprung

Om du behöver tillåta att en specifik lista över ursprung tillåts för CORS blir det lite mer komplicerat. Problemet uppstår när CDN cachelagrar huvudet Access-Control-Allow-Origin för det första CORS-ursprunget. När ett annat CORS-ursprung gör en efterföljande begäran, hanterar CDN den cachelagrade rubriken Access-Control-Allow-Origin , som inte matchar. Det finns flera sätt att åtgärda det här problemet.

Azure CDN-standardprofiler

På Azure CDN Standard från Microsoft kan du skapa en regel i standardregelmotorn för att kontrollera origin-huvudet på begäran. Om det är ett giltigt ursprung anger regeln huvudet Access-Control-Allow-Origin med önskat värde. I det här fallet ignoreras huvudet Access-Control-Allow-Origin från filens ursprungsserver och CDN:s regelmotor hanterar helt det tillåtna CORS-ursprunget.

Regelexempel med standardregelmotor

Dricks

Du kan lägga till ytterligare åtgärder i regeln för att ändra ytterligare svarshuvuden, till exempel Access-Control-Allow-Methods.

Azure CDN Premium från Edgio

Med hjälp av Edgio Premium-regelmotorn måste du skapa en regel för att kontrollera origin-huvudet på begäran. Om det är ett giltigt ursprung anger din regel huvudet Access-Control-Allow-Origin med ursprunget som anges i begäran. Om ursprunget som anges i ursprungsrubriken inte tillåts bör regeln utelämna rubriken Access-Control-Allow-Origin, vilket gör att webbläsaren avvisar begäran.

Det finns två sätt att lösa det här problemet med Premium-regelmotorn. I båda fallen ignoreras huvudet Access-Control-Allow-Origin från filens ursprungsserver och CDN:s regelmotor hanterar helt det tillåtna CORS-ursprunget.

Ett reguljärt uttryck med alla giltiga ursprung

I det här fallet skapar du ett reguljärt uttryck som innehåller alla ursprung som du vill tillåta:

https?:\/\/(www\.contoso\.com|contoso\.com|www\.microsoft\.com|microsoft.com\.com)$

Dricks

Azure CDN Premium från Edgio använder Perl-kompatibla reguljära uttryck som motor för reguljära uttryck. Du kan använda ett verktyg som Reguljära uttryck 101 för att verifiera ditt reguljära uttryck. Observera att tecknet "/" är giltigt i reguljära uttryck och inte behöver undvikas, men att undvika det tecknet anses vara en bästa praxis och förväntas av vissa regex-validerare.

Om det reguljära uttrycket matchar ersätter regeln rubriken Access-Control-Allow-Origin (om någon) från ursprunget med det ursprung som skickade begäran. Du kan också lägga till extra CORS-huvuden, till exempel Access-Control-Allow-Methods.

Regelexempel med reguljärt uttryck

Begärandehuvudregel för varje ursprung.

I stället för reguljära uttryck kan du i stället skapa en separat regel för varje ursprung som du vill tillåta med matchningsvillkoret För begäranderubrik jokertecken. Precis som med metoden med reguljära uttryck anger regelmotorn enbart CORS-huvudena.

Regelexempel utan reguljärt uttryck

Dricks

I exemplet instruerar användningen av jokertecknet * regelmotorn att matcha både HTTP och HTTPS.