CORS-ondersteuning (Cross-Origin Resource Sharing) voor Azure Storage
Vanaf versie 2013-08-15 ondersteunen de Azure-opslagservices CORS (Cross-Origin Resource Sharing) voor de blob-, tabel- en wachtrijservices. De bestandsservice ondersteunt CORS vanaf versie 21-02-2015.
CORS is een HTTP-functie waarmee een webtoepassing die wordt uitgevoerd onder één domein, toegang kan krijgen tot resources in een ander domein. Webbrowsers implementeren een beveiligingsbeperking die bekend staat als same-origin-beleid dat voorkomt dat een webpagina API's in een ander domein aanroept; CORS biedt een veilige manier om toe te staan dat één domein (het oorspronkelijke domein) API's in een ander domein aanroept. Zie de CORS-specificatie voor meer informatie over CORS.
U kunt CORS-regels afzonderlijk instellen voor elk van de Azure Storage-services door Eigenschappen van blobservice instellen, Eigenschappen van bestandsservice instellen, Eigenschappen van wachtrijservice instellen en Eigenschappen van tabelservice instellen aan te roepen. Zodra u de CORS-regels voor de service hebt ingesteld, wordt een correct geautoriseerde aanvraag voor de service vanuit een ander domein geëvalueerd om te bepalen of deze is toegestaan volgens de regels die u hebt opgegeven.
Belangrijk
CORS is geen autorisatiemechanisme. Elke aanvraag die wordt gedaan voor een opslagresource wanneer CORS is ingeschakeld, moet een geldige autorisatieheader hebben of moeten worden gedaan op basis van een openbare resource.
CORS wordt ondersteund voor alle typen opslagaccounts, met uitzondering van opslagaccounts voor algemeen gebruik v1 of v2 in de Premium-prestatielaag.
CORS-aanvragen begrijpen
Een CORS-aanvraag van een oorspronkelijk domein kan bestaan uit twee afzonderlijke aanvragen:
Een voorbereidende aanvraag, waarmee de CORS-beperkingen worden opgevraagd die door de service zijn opgelegd. De voorbereidende aanvraag is vereist, tenzij de aanvraagmethode een eenvoudige methode is, dat wil zeggen GET, HEAD of POST.
De werkelijke aanvraag, gemaakt op basis van de gewenste resource.
Voorbereidende aanvraag
De voorbereidende aanvraag vraagt de CORS-beperkingen op die door de accounteigenaar voor de opslagservice zijn ingesteld. De webbrowser (of een andere gebruikersagent) verzendt een OPTIONS-aanvraag die de aanvraagheaders, de methode en het oorspronkelijke domein bevat. De opslagservice evalueert de beoogde bewerking op basis van een vooraf geconfigureerde set CORS-regels die aangeven welke oorsprongdomeinen, aanvraagmethoden en aanvraagheaders mogen worden opgegeven voor een daadwerkelijke aanvraag voor een opslagresource.
Als CORS is ingeschakeld voor de service en er een CORS-regel is die overeenkomt met de voorbereidende aanvraag, reageert de service met statuscode 200 (OK) en neemt de vereiste Access-Control headers op in het antwoord.
Als CORS niet is ingeschakeld voor de service of als er geen CORS-regel overeenkomt met de voorbereidende aanvraag, reageert de service met statuscode 403 (Verboden).
Als de OPTIONS-aanvraag niet de vereiste CORS-headers bevat (de headers Origin en Access-Control-Request-Method), reageert de service met statuscode 400 (Ongeldige aanvraag).
Houd er rekening mee dat een voorbereidende aanvraag wordt geëvalueerd op basis van de service (Blob, Bestand, Wachtrij of Tabel) en niet op basis van de aangevraagde resource. De accounteigenaar moet CORS hebben ingeschakeld door de juiste eigenschappen van de accountservice in te stellen om de aanvraag te laten slagen.
Werkelijke aanvraag
Zodra de voorbereidende aanvraag is geaccepteerd en het antwoord is geretourneerd, verzendt de browser de werkelijke aanvraag naar de opslagresource. De browser weigert de werkelijke aanvraag onmiddellijk als de voorbereidende aanvraag wordt geweigerd.
De werkelijke aanvraag wordt behandeld als een normale aanvraag voor de opslagservice. De aanwezigheid van de Origin-header geeft aan dat de aanvraag een CORS-aanvraag is en dat de service de overeenkomende CORS-regels controleert. Als er een overeenkomst wordt gevonden, worden de Access-Control-headers toegevoegd aan het antwoord en teruggestuurd naar de client. Als er geen overeenkomst wordt gevonden, worden de CORS-Access-Control-headers niet geretourneerd.
CORS inschakelen voor Azure Storage
CORS-regels worden ingesteld op serviceniveau, dus u moet CORS voor elke service (Blob, Bestand, Wachtrij en Tabel) afzonderlijk in- of uitschakelen. CORS is standaard uitgeschakeld voor elke service. Als u CORS wilt inschakelen, moet u de juiste service-eigenschappen instellen met versie 2013-08-15 of hoger voor de blob-, wachtrij- en tabelservices, of versie 2015-02-21 of voor de bestandsservice. U schakelt CORS in door CORS-regels toe te voegen aan de service-eigenschappen. Voor meer informatie over het in- of uitschakelen van CORS voor een service en het instellen van CORS-regels raadpleegt u Eigenschappen van blobservice instellen, Eigenschappen van bestandsservice instellen, Eigenschappen van tabelservice instellen en Eigenschappen van wachtrijservice instellen.
Hier volgt een voorbeeld van één CORS-regel, opgegeven via een Set Service Properties
bewerking:
<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>
Elk element dat in de CORS-regel is opgenomen, wordt hieronder beschreven:
AllowedOrigins: de oorspronkelijke domeinen die een aanvraag mogen indienen bij de opslagservice via CORS. Het oorspronkelijke domein is het domein waaruit de aanvraag afkomstig is. Houd er rekening mee dat de oorsprong een exacte hoofdlettergevoelige overeenkomst moet zijn met de oorsprong die de leeftijd van de gebruiker naar de service verzendt.
U kunt het jokerteken '*' gebruiken in plaats van een opgegeven domein om alle oorspronkelijke domeinen toe te staan aanvragen te doen via CORS. U kunt ook het jokerteken in plaats van een subdomein gebruiken om alle subdomeinen van een bepaald domein toe te staan aanvragen te doen via CORS. In het bovenstaande voorbeeld kunnen alle subdomeinen van
contoso.com
aanvragen doen via CORS, terwijl alleen aanvragen van hetwww
subdomein vanfabrikam.com
zijn toegestaan via CORS.AllowedMethods: de methoden (HTTP-aanvraagwoorden) die het oorspronkelijke domein kan gebruiken voor een CORS-aanvraag. In het bovenstaande voorbeeld zijn alleen PUT- en GET-aanvragen toegestaan.
AllowedHeaders: de aanvraagheaders die het oorspronkelijke domein kan opgeven voor de CORS-aanvraag. In het bovenstaande voorbeeld zijn alle metagegevensheaders die beginnen met
x-ms-meta-data
,x-ms-meta-target
enx-ms-meta-abc
toegestaan. Houd er rekening mee dat het jokerteken *aangeeft dat elke koptekst die begint met het opgegeven voorvoegsel is toegestaan.ExposedHeaders: de antwoordheaders die in het antwoord op de CORS-aanvraag kunnen worden verzonden en door de browser worden weergegeven aan de verlener van de aanvraag. In het bovenstaande voorbeeld wordt de browser geïnstrueerd om elke header weer te geven die begint met
x-ms-meta
.MaxAgeInSeconds: de maximale hoeveelheid tijd dat een browser de voorbereidende OPTIONS-aanvraag in de cache moet opslaan.
De Azure-opslagservices bieden ondersteuning voor het opgeven van voorvoegsels voor de elementen AllowedHeaders en ExposedHeaders . Als u een categorie kopteksten wilt toestaan, kunt u een gemeenschappelijk voorvoegsel voor die categorie opgeven. Als u bijvoorbeeld opgeeft x-ms-meta*
als een voorvoegsel koptekst, wordt een regel tot stand gebracht die overeenkomt met alle headers die beginnen met x-ms-meta
.
De volgende beperkingen zijn van toepassing op CORS-regels:
U kunt maximaal vijf CORS-regels per opslagservice opgeven (blob, bestand, tabel en wachtrij).
De maximale grootte van alle CORS-regels voor de aanvraag, met uitzondering van XML-tags, mag niet groter zijn dan 2 KiB.
De lengte van een toegestane koptekst, weergegeven koptekst of toegestane oorsprong mag niet langer zijn dan 256 tekens.
Toegestane headers en weergegeven headers kunnen zijn:
- Letterlijke headers, waarbij de exacte headernaam wordt opgegeven, zoals x-ms-meta-processed. Er kunnen maximaal 64 letterlijke headers worden opgegeven voor de aanvraag.
- Voorvoegselkoppen, waarbij een voorvoegsel van de header wordt opgegeven, zoals x-ms-meta-data*. Als u op deze manier een voorvoegsel opgeeft, wordt elke koptekst die begint met het opgegeven voorvoegsel, toegestaan of weergegeven. Er kunnen maximaal twee voorvoegsels worden opgegeven voor de aanvraag.
De methoden (of HTTP-woorden) die zijn opgegeven in het element AllowedMethods moeten voldoen aan de methoden die worden ondersteund door Azure Storage Service-API's. Ondersteunde methoden zijn DELETE, GET, HEAD, MERGE, POST, PATCH, OPTIONS en PUT.
Inzicht in de evaluatielogica van CORS-regels
Wanneer een opslagservice een voorbereidende of werkelijke aanvraag ontvangt, wordt die aanvraag geëvalueerd op basis van de CORS-regels die u hebt ingesteld voor de service via de juiste bewerking Service-eigenschappen instellen. CORS-regels worden geëvalueerd in de volgorde waarin ze zijn ingesteld in de aanvraagtekst van de bewerking Service-eigenschappen instellen.
CORS-regels worden als volgt geëvalueerd:
Eerst wordt het oorspronkelijke domein van de aanvraag gecontroleerd op basis van de domeinen die worden vermeld voor het
AllowedOrigins
-element. Als het oorspronkelijke domein is opgenomen in de lijst of als alle domeinen zijn toegestaan met het jokerteken '*', wordt de evaluatie van de regels uitgevoerd. Als het oorspronkelijke domein niet is opgenomen, mislukt de aanvraag.Vervolgens wordt de methode (of HET HTTP-werkwoord) van de aanvraag gecontroleerd op basis van de methoden die worden vermeld in het
AllowedMethods
-element. Als de methode in de lijst wordt opgenomen, wordt de evaluatie van de regels voortgezet; Zo niet, dan mislukt de aanvraag.Als de aanvraag overeenkomt met een regel in het oorspronkelijke domein en de bijbehorende methode, wordt die regel geselecteerd om de aanvraag te verwerken en worden er geen verdere regels geëvalueerd. Voordat de aanvraag kan worden uitgevoerd, worden eventuele headers die in de aanvraag zijn opgegeven echter gecontroleerd op basis van de headers die in het
AllowedHeaders
element worden vermeld. Als de verzonden headers niet overeenkomen met de toegestane headers, mislukt de aanvraag.
Aangezien de regels worden verwerkt in de volgorde waarin ze aanwezig zijn in de aanvraagbody, wordt aanbevolen dat u de meest beperkende regels met betrekking tot oorsprongen als eerste in de lijst opgeeft, zodat deze eerst worden geëvalueerd. Geef aan het einde van de lijst regels op die minder beperkend zijn, bijvoorbeeld een regel om alle origins toe te staan.
Voorbeeld: CORS-regels evalueren
In het volgende voorbeeld ziet u een gedeeltelijke aanvraagbody voor een bewerking om CORS-regels in te stellen voor de opslagservices. Zie Eigenschappen van blobservice instellen, Eigenschappen van bestandsservice instellen, Eigenschappen van wachtrijservice instellen en Eigenschappen van tabelservice instellen voor meer informatie over het samenstellen van de aanvraag.
<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>
Overweeg vervolgens de volgende CORS-aanvragen:
Methode | Oorsprong | Aanvraagheaders | Regelovereenkomst | Resultaat |
---|---|---|---|---|
PUT | http://www.contoso.com |
x-ms-blob-content-type |
Eerste regel | Geslaagd |
GET | http://www.contoso.com |
x-ms-blob-content-type |
Tweede regel | Geslaagd |
GET | http://www.contoso.com |
x-ms-client-request-id |
Tweede regel | Fout |
De eerste aanvraag komt overeen met de eerste regel: het oorspronkelijke domein komt overeen met de toegestane origins, de methode komt overeen met de toegestane methoden en de header komt overeen met de toegestane headers, en slaagt dus.
De tweede aanvraag komt niet overeen met de eerste regel omdat de methode niet overeenkomt met de toegestane methoden. Het komt echter wel overeen met de tweede regel, dus het slaagt.
De derde aanvraag komt overeen met de tweede regel in het oorspronkelijke domein en de methode, zodat er geen verdere regels worden geëvalueerd. De x-ms-client-request-id
header is echter niet toegestaan door de tweede regel, dus de aanvraag mislukt, ondanks het feit dat de semantiek van de derde regel deze zou hebben toegestaan.
Notitie
Hoewel in dit voorbeeld een minder beperkende regel wordt weergegeven vóór een meer beperkende regel, is het over het algemeen het beste om eerst de meest beperkende regels weer te geven.
Informatie over hoe de Vary-header is ingesteld
De Vary
header is een standaard HTTP/1.1-header die bestaat uit een set aanvraagheadervelden die de browser of gebruikersagent adviseren over de criteria die door de server zijn geselecteerd om de aanvraag te verwerken. De Vary
header wordt voornamelijk gebruikt voor het opslaan in cache door proxy's, browsers en CDN's, die deze gebruiken om te bepalen hoe het antwoord in de cache moet worden opgeslagen. Zie de specificatie voor de header Vary voor meer informatie.
Wanneer de browser of een andere gebruikersagent het antwoord van een CORS-aanvraag in de cache opslaat, wordt het oorspronkelijke domein in de cache opgeslagen als de toegestane oorsprong. Wanneer een tweede domein dezelfde aanvraag voor een opslagresource uitgeeft terwijl de cache actief is, haalt de gebruikersagent het oorspronkelijke domein in de cache op. Het tweede domein komt niet overeen met het domein in de cache, dus de aanvraag mislukt wanneer deze anders zou slagen. In bepaalde gevallen stelt Azure Storage de Vary
header in op Origin
om de gebruikersagent te instrueren om de volgende CORS-aanvraag naar de service te verzenden wanneer het aanvragende domein verschilt van de oorsprong in de cache.
Azure Storage stelt de Vary
header Origin
in op voor werkelijke GET/HEAD-aanvragen in de volgende gevallen:
Wanneer de oorsprong van de aanvraag exact overeenkomt met de toegestane oorsprong die is gedefinieerd door een CORS-regel. De CORS-regel mag geen jokerteken '*' bevatten.
Er is geen regel die overeenkomt met de oorsprong van de aanvraag, maar CORS is ingeschakeld voor de opslagservice.
In het geval dat een GET/HEAD-aanvraag overeenkomt met een CORS-regel die alle origins toestaat, geeft het antwoord aan dat alle origins zijn toegestaan en dat de cache van de gebruikersagent volgende aanvragen van elk origin-domein toestaat terwijl de cache actief is.
Houd er rekening mee dat voor aanvragen die andere methoden dan GET/HEAD gebruiken, de header niet door de opslagservices wordt ingesteld Vary
, omdat antwoorden op deze methoden niet in de cache worden opgeslagen door gebruikersagents.
De volgende tabel geeft aan hoe Azure Storage reageert op GET/HEAD-aanvragen op basis van de eerder genoemde cases:
Oorsprongheader aanwezig op aanvraag | CORS-regel(en) die zijn opgegeven voor deze service | Er bestaat een overeenkomende regel die alle oorsprongen (*) toestaat | Er bestaat een overeenkomende regel voor exacte oorsprongovereenkomst | Antwoord bevat de Vary-header ingesteld op Origin | Het antwoord bevat Access-Control-Allowed-Origin: "*" | Het antwoord bevat Access-Control-Exposed-Headers |
---|---|---|---|---|---|---|
Nee | Nee | Nee | Nee | Nee | Nee | Nee |
Nee | Ja | Nee | Nee | Ja | Nee | Nee |
Nee | Ja | Ja | Nee | Nee | Ja | Ja |
Ja | Nee | Nee | Nee | Nee | Nee | Nee |
Ja | Ja | Nee | Ja | Ja | Nee | Ja |
Ja | Ja | Nee | Nee | Ja | Nee | Nee |
Ja | Ja | Ja | Nee | Nee | Ja | Ja |
Facturering voor CORS-aanvragen
Geslaagde voorbereidende aanvragen worden gefactureerd als u CORS hebt ingeschakeld voor een van de opslagservices voor uw account (door Eigenschappen van blobservice instellen, Eigenschappen van wachtrijservice instellen, Eigenschappen van bestandsservice instellen of Tabelservice-eigenschappen instellen aan te roepen). Als u de kosten wilt minimaliseren, kunt u overwegen om het MaxAgeInSeconds
element in uw CORS-regels in te stellen op een grote waarde, zodat de gebruikersagent de aanvraag in de cache opslaat.
Mislukte voorbereidende aanvragen worden niet gefactureerd.