Podpora sdílení prostředků mezi zdroji (CORS) pro Azure Storage
Počínaje verzí 2013-08-15 podporují služby Úložiště Azure sdílení prostředků mezi zdroji (CORS) pro služby Blob, Table a Queue. Služba File podporuje CORS od verze 2015-02-21.
CORS je funkce HTTP, která umožňuje webové aplikaci spuštěné v jedné doméně přistupovat k prostředkům v jiné doméně. Webové prohlížeče implementují omezení zabezpečení označované jako zásady stejného původu , které brání webové stránce volat rozhraní API v jiné doméně. CORS poskytuje bezpečný způsob, jak jedné doméně (původní doméně) povolit volání rozhraní API v jiné doméně. Podrobnosti o CORS najdete ve specifikaci CORS .
Pravidla CORS můžete nastavit jednotlivě pro každou službu Azure Storage voláním nastavit vlastnosti služby Blob Service, Nastavit vlastnosti služby File Service, Nastavit vlastnosti frontové služby a Nastavit vlastnosti služby Table Service. Jakmile pravidla CORS pro danou službu nastavíte, vyhodnotí se správně autorizovaný požadavek na službu z jiné domény, aby se zjistilo, jestli je povolená podle pravidel, která jste zadali.
Důležité
CORS není autorizační mechanismus. Každý požadavek provedený proti prostředku úložiště, když je povolený CORS, musí mít buď platnou autorizační hlavičku, nebo musí být proveden proti veřejnému prostředku.
CORS se podporuje pro všechny typy účtů úložiště s výjimkou účtů úložiště pro obecné účely verze 1 nebo v2 na úrovni výkonu Premium.
Principy požadavků CORS
Žádost CORS z původní domény se může skládat ze dvou samostatných požadavků:
Předběžný požadavek, který se dotazuje omezení CORS uložených službou. Předběžný požadavek se vyžaduje, pokud metoda požadavku není jednoduchá metoda, což znamená GET, HEAD nebo POST.
Skutečný požadavek provedený proti požadovanému prostředku.
Předběžná žádost
Předběžná žádost se dotazuje na omezení CORS, která pro službu úložiště stanovil vlastník účtu. Webový prohlížeč (nebo jiný uživatelský agent) odešle požadavek OPTIONS, který obsahuje hlavičky požadavku, metodu a původní doménu. Služba úložiště vyhodnocuje zamýšlenou operaci na základě předem nakonfigurované sady pravidel CORS, která určují, které domény původu, metody požadavků a hlavičky požadavků mohou být zadány ve skutečném požadavku na prostředek úložiště.
Pokud je pro službu povolený CORS a existuje pravidlo CORS, které odpovídá předběžnému požadavku, služba odpoví stavovým kódem 200 (OK) a zahrne do odpovědi požadované hlavičky Access-Control.
Pokud cors není pro službu povolený nebo žádné pravidlo CORS neodpovídá předběžnému požadavku, služba odpoví stavovým kódem 403 (Zakázáno).
Pokud požadavek OPTIONS neobsahuje požadované hlavičky CORS (hlavičky Origin a Access-Control-Request-Method), služba odpoví stavovým kódem 400 (chybný požadavek).
Všimněte si, že předběžný požadavek se vyhodnocuje vůči službě (objekt blob, soubor, fronta nebo tabulka), a ne vůči požadovanému prostředku. Vlastník účtu musí povolit CORS nastavením odpovídajících vlastností služby účtu, aby žádost byla úspěšná.
Skutečná žádost
Jakmile se předběžná žádost přijme a vrátí odpověď, prohlížeč odešle skutečný požadavek do prostředku úložiště. Prohlížeč okamžitě zamítne vlastní požadavek, pokud se předběžná žádost zamítne.
Skutečný požadavek se považuje za normální požadavek vůči službě úložiště. Přítomnost hlavičky Origin znamená, že požadavek je požadavek CORS a služba zkontroluje odpovídající pravidla CORS. Pokud se najde shoda, přidají se do odpovědi hlavičky Access-Control a odešlou se zpět klientovi. Pokud se shoda nenajde, hlavičky cors Access-Control se nevrátí.
Povolení CORS pro Azure Storage
Pravidla CORS se nastavují na úrovni služby, takže je potřeba cors povolit nebo zakázat pro každou službu (objekty blob, soubor, frontu a tabulku) zvlášť. Ve výchozím nastavení je CORS pro jednotlivé služby zakázáno. Pokud chcete cors povolit, musíte nastavit odpovídající vlastnosti služby pomocí verze 2013-08-15 nebo novější pro služby Blob, Queue a Table nebo verze 2015-02-21 nebo pro službu File. CORS povolíte přidáním pravidel CORS do vlastností služby. Podrobnosti o tom, jak povolit nebo zakázat CORS pro službu a jak nastavit pravidla CORS, najdete v tématu Nastavení vlastností služby Blob Service, Nastavení vlastností služby File Service, Nastavení vlastností služby Table Service a Nastavení vlastností služby fronty.
Tady je ukázka jednoho pravidla CORS zadaného Set Service Properties
prostřednictvím operace:
<Cors>
<CorsRule>
<AllowedOrigins>http://*.contoso.com, http://www.fabrikam.com</AllowedOrigins>
<AllowedMethods>PUT,GET</AllowedMethods>
<AllowedHeaders>x-ms-meta-data*,x-ms-meta-target*,x-ms-meta-abc</AllowedHeaders>
<ExposedHeaders>x-ms-meta-*</ExposedHeaders>
<MaxAgeInSeconds>200</MaxAgeInSeconds>
</CorsRule>
<Cors>
Každý prvek, který je součástí pravidla CORS, je popsán níže:
AllowedOrigins: Původní domény, které mají povoleno podat požadavek na službu úložiště prostřednictvím CORS. Původní doména je doména, ze které požadavek pochází. Všimněte si, že původ musí přesně rozlišovat malá a malá písmena s původem, který uživatel odesílá službě.
Místo zadané domény můžete použít zástupný znak *, který umožní všem doménám původu vytvářet požadavky prostřednictvím CORS. Můžete také použít zástupný znak místo subdomény, aby všechny subdomény dané domény mohly provádět požadavky prostřednictvím CORS. Ve výše uvedeném příkladu můžou všechny subdomény služby
contoso.com
provádět požadavky prostřednictvím CORS, zatímco prostřednictvím CORS jsou povoleny pouze požadavky zwww
subdoményfabrikam.com
společnosti.AllowedMethods: Metody (příkazy požadavku HTTP), které může původní doména použít pro požadavek CORS. V příkladu výše jsou povoleny pouze požadavky PUT a GET.
AllowedHeaders: Hlavičky požadavku, které může původní doména zadat v požadavku CORS. Ve výše uvedeném příkladu jsou povoleny všechny hlavičky metadat začínající
x-ms-meta-data
na ,x-ms-meta-target
ax-ms-meta-abc
. Všimněte si, že zástupný znak *označuje, že je povolené jakékoli záhlaví začínající zadanou předponou.ExposedHeaders: Hlavičky odpovědi, které mohou být odeslány v odpovědi na požadavek CORS a zpřístupněny prohlížečem vystaviteli požadavku. Ve výše uvedeném příkladu je prohlížeč instruován, aby zpřístupnil všechny hlavičky začínající na
x-ms-meta
.MaxAgeInSeconds: Maximální doba, po kterou by měl prohlížeč uložit do mezipaměti předběžný požadavek OPTIONS.
Služby Azure Storage podporují zadávání hlaviček s předponou pro jak allowedHeaders , tak pro exposedHeaders elementy. Pokud chcete povolit kategorii hlaviček, můžete zadat společnou předponu této kategorie. Když například zadáte x-ms-meta*
hlavičku s předponou, vytvoří se pravidlo, které bude odpovídat všem záhlavím začínajícím x-ms-meta
na .
Na pravidla CORS platí následující omezení:
Na službu úložiště můžete zadat až pět pravidel CORS (objekty blob, soubor, tabulka a fronta).
Maximální velikost všech nastavení pravidel CORS v požadavku s výjimkou značek XML by neměla překročit 2 KiB.
Délka povolené hlavičky, zveřejněné hlavičky nebo povoleného původu by neměla překročit 256 znaků.
Povolené a vystavené hlavičky můžou být:
- Záhlaví literálů, kde je zadaný přesný název hlavičky, například x-ms-meta-processed. V požadavku může být zadáno maximálně 64 záhlaví literálů.
- Hlavičky s předponou, kde je k dispozici předpona záhlaví, například x-ms-meta-data*. Zadáním předpony tímto způsobem povolíte nebo zpřístupníte jakoukoli hlavičku, která začíná danou předponou. V požadavku mohou být zadány maximálně dvě hlavičky s předponou.
Metody (nebo příkazy HTTP) zadané v elementu AllowedMethods musí odpovídat metodám podporovaným rozhraními API služby Azure Storage. Podporované metody jsou DELETE, GET, HEAD, MERGE, POST, PATCH, OPTIONS a PUT.
Principy logiky vyhodnocení pravidel CORS
Když služba úložiště obdrží předběžný nebo skutečný požadavek, vyhodnotí tento požadavek na základě pravidel CORS, která jste pro službu vytvořili prostřednictvím příslušné operace Nastavit vlastnosti služby. Pravidla CORS se vyhodnocují v pořadí, ve kterém byla nastavena v textu požadavku operace Nastavit vlastnosti služby.
Pravidla CORS se vyhodnocují takto:
Nejprve se zkontroluje původní doména požadavku s doménami uvedenými pro
AllowedOrigins
prvek. Pokud je v seznamu zahrnuta původní doména nebo jsou všechny domény povoleny se zástupným znakem *, vyhodnocení pravidel pokračuje. Pokud není zahrnuta původní doména, požadavek se nezdaří.Dále se zkontroluje metoda (nebo příkaz HTTP) požadavku s metodami uvedenými v elementu
AllowedMethods
. Pokud je metoda zahrnuta v seznamu, pak vyhodnocení pravidel pokračuje; Pokud ne, požadavek selže.Pokud požadavek odpovídá pravidlu ve své původní doméně a jeho metodě, je toto pravidlo vybráno pro zpracování požadavku a nebudou vyhodnocena žádná další pravidla. Než však může být požadavek úspěšný, všechny hlavičky zadané v požadavku jsou zkontrolovány proti hlavičkám uvedeným v elementu
AllowedHeaders
. Pokud se odeslané hlavičky neshodují s povolenými hlavičkami, požadavek selže.
Vzhledem k tomu, že se pravidla zpracovávají v pořadí, ve kterém jsou obsažena v textu požadavku, doporučujeme v seznamu jako první zadat nejomežnější pravidla týkající se původů, aby se vyhodnocovala jako první. Zadejte pravidla, která jsou méně omezující – například pravidlo pro povolení všech počátků – na konci seznamu.
Příklad – vyhodnocení pravidel CORS
Následující příklad ukazuje část textu požadavku pro operaci pro nastavení pravidel CORS pro služby úložiště. Podrobnosti o vytvoření požadavku najdete v tématech Nastavení vlastností služby Blob,Nastavení vlastností služby File Service, Nastavení vlastností služby fronty a Nastavení vlastností služby Table Service .
<Cors>
<CorsRule>
<AllowedOrigins>http://www.contoso.com</AllowedOrigins>
<AllowedMethods>PUT,HEAD</AllowedMethods>
<MaxAgeInSeconds>5</MaxAgeInSeconds>
<ExposedHeaders>x-ms-*</ExposedHeaders>
<AllowedHeaders>x-ms-blob-content-type, x-ms-blob-content-disposition</AllowedHeaders>
</CorsRule>
<CorsRule>
<AllowedOrigins>*</AllowedOrigins>
<AllowedMethods>PUT,GET</AllowedMethods>
<MaxAgeInSeconds>5</MaxAgeInSeconds>
<ExposedHeaders>x-ms-*</ExposedHeaders>
<AllowedHeaders>x-ms-blob-content-type, x-ms-blob-content-disposition</AllowedHeaders>
</CorsRule>
<CorsRule>
<AllowedOrigins>http://www.contoso.com</AllowedOrigins>
<AllowedMethods>GET</AllowedMethods>
<MaxAgeInSeconds>5</MaxAgeInSeconds>
<ExposedHeaders>x-ms-*</ExposedHeaders>
<AllowedHeaders>x-ms-client-request-id</AllowedHeaders>
</CorsRule>
</Cors>
Dále zvažte následující žádosti CORS:
Metoda | Zdroj | Hlavičky požadavku | Shoda pravidel | Výsledek |
---|---|---|---|---|
PUT | http://www.contoso.com |
x-ms-blob-content-type |
První pravidlo | Success |
GET | http://www.contoso.com |
x-ms-blob-content-type |
Druhé pravidlo | Success |
GET | http://www.contoso.com |
x-ms-client-request-id |
Druhé pravidlo | Selhání |
První požadavek odpovídá prvnímu pravidlu – původní doména odpovídá povoleným původům, metoda odpovídá povoleným metodám a hlavička odpovídá povoleným hlavičce – a tak proběhne úspěšně.
Druhý požadavek neodpovídá prvnímu pravidlu, protože metoda neodpovídá povoleným metodám. To ale odpovídá druhému pravidlu, takže je úspěšné.
Třetí požadavek odpovídá druhému pravidlu v původní doméně a metodě, takže se nevyhodnocují žádná další pravidla. Druhé pravidlo ale hlavičku x-ms-client-request-id
nepovoluje, takže požadavek selže, i když by sémantika třetího pravidla umožnila, aby byl úspěšný.
Poznámka
I když tento příklad ukazuje méně omezující pravidlo před více omezujícím pravidlem, obecně je osvědčeným postupem uvést seznam nejvíce omezujících pravidel jako první.
Vysvětlení nastavení hlavičky Vary
Hlavička Vary
je standardní hlavička HTTP/1.1, která se skládá ze sady polí hlaviček požadavku, která prohlížeči nebo uživatelskému agentu poradí s kritérii vybranými serverem pro zpracování požadavku. Hlavičku Vary
používají hlavně proxy servery, prohlížeče a sítě CDN, které ji používají k určení způsobu ukládání odpovědi do mezipaměti. Podrobnosti najdete ve specifikaci hlavičky Vary.
Když prohlížeč nebo jiný uživatelský agent ukládá odpověď z požadavku CORS do mezipaměti, původní doména se ukládá do mezipaměti jako povolený původ. Když druhá doména vydá stejný požadavek na prostředek úložiště, zatímco je mezipaměť aktivní, uživatelský agent načte původní doménu uloženou v mezipaměti. Druhá doména neodpovídá doméně uložené v mezipaměti, takže požadavek selže, pokud by jinak proběhl úspěšně. V některých případech Azure Storage nastaví hlavičku Vary
na, Origin
aby dal uživatelskému agentovi pokyn, aby odeslal do služby následný požadavek CORS, když se žádající doména liší od původu uloženého v mezipaměti.
Azure Storage nastaví hlavičku Vary
na Origin
pro skutečné požadavky GET/HEAD v následujících případech:
Když původ požadavku přesně odpovídá povolenému původu definovanému pravidlem CORS. Aby bylo možné přesně shodovat, pravidlo CORS nemusí obsahovat zástupný znak *.
Neexistuje žádné pravidlo, které by odpovídalo původu požadavku, ale cors je pro službu úložiště povolená.
V případě, že požadavek GET/HEAD odpovídá pravidlu CORS, které povoluje všechny zdroje, znamená odpověď, že jsou povoleny všechny zdroje a mezipaměť uživatelského agenta povolí následné požadavky z libovolné domény původu, dokud je mezipaměť aktivní.
Všimněte si, že u požadavků používajících jiné metody než GET/HEAD služby úložiště nenastaví hlavičku Vary
, protože odpovědi na tyto metody nejsou uloženy do mezipaměti uživatelskými agenty.
Následující tabulka uvádí, jak bude Azure Storage reagovat na požadavky GET/HEAD na základě výše uvedených případů:
Původní hlavička je k dispozici na vyžádání | Pravidla CORS určená pro tuto službu | Existuje odpovídající pravidlo, které umožňuje všechny zdroje (*) | Existuje odpovídající pravidlo pro přesnou shodu původu. | Odpověď obsahuje různé hlavičky nastavené na Origin. | Odpověď obsahuje Access-Control-Allowed-Origin: "*" | Odpověď zahrnuje hlavičky Access-Control-Exposed-Headers |
---|---|---|---|---|---|---|
No | Ne | Ne | Ne | Ne | Ne | Ne |
Ne | Ano | Ne | Ne | Ano | Ne | Ne |
Ne | Ano | Ano | Ne | Ne | Yes | Yes |
Ano | Ne | Ne | Ne | Ne | Ne | Ne |
Ano | Ano | Ne | Ano | Ano | Ne | Ano |
Ano | Ano | Ne | Ne | Ano | Ne | Ne |
Ano | Ano | Ano | Ne | Ne | Ano | Ano |
Fakturace žádostí CORS
Úspěšné předběžné požadavky se účtují, pokud jste povolili CORS pro některou ze služeb úložiště pro váš účet (voláním Nastavit vlastnosti služby Blob Service, Nastavit vlastnosti služby fronty, Nastavit vlastnosti služby File Service nebo Nastavit vlastnosti služby Table Service). Pokud chcete minimalizovat poplatky, zvažte nastavení MaxAgeInSeconds
prvku v pravidlech CORS na velkou hodnotu tak, aby uživatelský agent požadavek do mezipaměti.
Neúspěšné předběžné požadavky se nebudou fakturovat.