Obsługa współużytkowania zasobów między źródłami (CORS) dla usługi Azure Storage
Począwszy od wersji 2013-08-15, usługi magazynu platformy Azure obsługują współużytkowanie zasobów między źródłami (CORS) dla usług Blob, Table i Queue. Usługa plików obsługuje mechanizm CORS począwszy od wersji 2015-02-21.
Mechanizm CORS (udostępnianie zasobów między źródłami) to funkcja protokołu HTTP, która umożliwia aplikacji internetowej działającej w ramach jednej domeny dostęp do zasobów w innej domenie. Przeglądarki internetowe implementują ograniczenie zabezpieczeń znane jako zasady o tym samym pochodzeniu , które uniemożliwia stronie internetowej wywoływanie interfejsów API w innej domenie; Mechanizm CORS zapewnia bezpieczny sposób zezwalania jednej domenie (domenie pochodzenia) na wywoływanie interfejsów API w innej domenie. Zobacz specyfikację mechanizmu CORS , aby uzyskać szczegółowe informacje na temat mechanizmu CORS.
Reguły CORS można ustawić indywidualnie dla każdej z usług Azure Storage, wywołując funkcję Set Blob Service Properties (Ustaw właściwości usługi Blob Service), Set File Service Properties (Ustawianie właściwości usługi plików), Set Queue Service Properties (Ustawianie właściwości usługi Kolejki) i Set Table Service Properties (Ustawianie właściwości usługi Table Service). Po ustawieniu reguł CORS dla usługi prawidłowo uwierzytelnione żądanie przesłane do usługi z innej domeny zostanie ocenione, aby określić, czy jest ono dozwolone zgodnie z określonymi regułami.
Ważne
MECHANIZM CORS nie jest mechanizmem autoryzacji. Każde żądanie dotyczące zasobu magazynu, gdy włączono mechanizm CORS, musi mieć prawidłowy nagłówek autoryzacji lub musi zostać wykonany względem zasobu publicznego.
Mechanizm CORS jest obsługiwany dla wszystkich typów kont magazynu z wyjątkiem kont magazynu ogólnego przeznaczenia w wersji 1 lub 2 w warstwie wydajności Premium.
Opis żądań CORS
Żądanie CORS z domeny pochodzenia może składać się z dwóch oddzielnych żądań:
Żądanie wstępne, które wysyła zapytanie do ograniczeń CORS narzuconych przez usługę. Żądanie wstępne jest wymagane, chyba że metoda żądania jest prostą metodą, czyli GET, HEAD lub POST.
Rzeczywiste żądanie wykonane względem żądanego zasobu.
Żądanie wstępne
Żądanie wstępne wysyła zapytanie do ograniczeń CORS, które zostały ustanowione dla usługi magazynu przez właściciela konta. Przeglądarka internetowa (lub inny agent użytkownika) wysyła żądanie OPTIONS, które zawiera nagłówki żądania, metodę i domenę źródła. Usługa magazynu ocenia zamierzoną operację na podstawie wstępnie skonfigurowanego zestawu reguł CORS, które określają, które domeny pochodzenia, metody żądania i nagłówki żądań mogą być określone na rzeczywistym żądaniu względem zasobu magazynu.
Jeśli mechanizm CORS jest włączony dla usługi i istnieje reguła CORS zgodna z żądaniem wstępnym, usługa odpowiada kodem stanu 200 (OK) i zawiera wymagane nagłówki Access-Control w odpowiedzi.
Jeśli mechanizm CORS nie jest włączony dla usługi lub żadna reguła CORS nie pasuje do żądania wstępnego, usługa odpowie kodem stanu 403 (Zabronione).
Jeśli żądanie OPTIONS nie zawiera wymaganych nagłówków CORS (nagłówki Origin i Access-Control-Request-Method), usługa odpowie kodem stanu 400 (Nieprawidłowe żądanie).
Należy pamiętać, że żądanie wstępne jest oceniane względem usługi (obiektu blob, pliku, kolejki lub tabeli), a nie względem żądanego zasobu. Właściciel konta musi włączyć mechanizm CORS, ustawiając odpowiednie właściwości usługi konta, aby żądanie zakończyło się pomyślnie.
Rzeczywiste żądanie
Po zaakceptowaniu żądania wstępnego i zwróceniu odpowiedzi przeglądarka wyśle rzeczywiste żądanie względem zasobu magazynu. Przeglądarka natychmiast odrzuci rzeczywiste żądanie, jeśli żądanie wstępne zostanie odrzucone.
Rzeczywiste żądanie jest traktowane jako normalne żądanie względem usługi magazynu. Obecność nagłówka Origin wskazuje, że żądanie jest żądaniem CORS, a usługa sprawdzi zgodne reguły CORS. W przypadku znalezienia dopasowania nagłówki Access-Control są dodawane do odpowiedzi i wysyłane z powrotem do klienta. Jeśli dopasowanie nie zostanie znalezione, nagłówki CORS Access-Control nie zostaną zwrócone.
Włączanie mechanizmu CORS dla usługi Azure Storage
Reguły CORS są ustawiane na poziomie usługi, dlatego należy osobno włączyć lub wyłączyć mechanizm CORS dla każdej usługi (obiekt blob, plik, kolejka i tabela). Domyślnie mechanizm CORS jest wyłączony dla każdej usługi. Aby włączyć mechanizm CORS, należy ustawić odpowiednie właściwości usługi przy użyciu wersji 2013-08-15 lub nowszej dla usług Blob, Queue i Table albo w wersji 2015-02-21 lub dla usługi plików. Mechanizm CORS można włączyć, dodając reguły CORS do właściwości usługi. Aby uzyskać szczegółowe informacje na temat włączania lub wyłączania mechanizmu CORS dla usługi oraz ustawiania reguł CORS, zapoznaj się z tematem Ustawianie właściwości usługi Blob Service, Ustawianie właściwości usługi plików, Ustawianie właściwości usługi Table Service i Ustawianie właściwości usługi kolejki.
Oto przykład pojedynczej reguły CORS określonej za pomocą Set Service Properties
operacji:
<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żdy element zawarty w regule CORS został opisany poniżej:
AllowedOrigins: domeny pochodzenia, które mogą wysyłać żądania do usługi magazynu za pośrednictwem mechanizmu CORS. Domena źródła to domena, z której pochodzi żądanie. Należy pamiętać, że pochodzenie musi być dokładnym dopasowaniem wielkości liter do źródła, które wiek użytkownika wysyła do usługi.
Możesz użyć symbolu wieloznakowego "*" zamiast określonej domeny, aby umożliwić wszystkim domenom pochodzenia wykonywanie żądań za pośrednictwem mechanizmu CORS. Można również użyć symbolu wieloznacznych zamiast poddomeny, aby zezwolić na wszystkie poddomeny danej domeny na wykonywanie żądań za pośrednictwem mechanizmu CORS. W powyższym przykładzie wszystkie poddomeny
contoso.com
mogą wysyłać żądania za pośrednictwem mechanizmu CORS, podczas gdy tylko żądania zwww
poddomenyfabrikam.com
elementu są dozwolone za pośrednictwem mechanizmu CORS.AllowedMethods: metody (czasowniki żądań HTTP), których domena pochodzenia może używać dla żądania CORS. W powyższym przykładzie są dozwolone jedynie żądania PUT i GET.
AllowedHeaders: nagłówki żądań, które domena źródła może określać w żądaniu CORS. W powyższym przykładzie wszystkie nagłówki metadanych rozpoczynające się od
x-ms-meta-data
,x-ms-meta-target
ix-ms-meta-abc
są dozwolone. Należy pamiętać, że symbol wieloznaczny "*" wskazuje, że każdy nagłówek rozpoczynający się od określonego prefiksu jest dozwolony.ExposedHeaders: nagłówki odpowiedzi, które mogą być wysyłane w odpowiedzi na żądanie CORS i udostępniane przez przeglądarkę wystawcy żądania. W powyższym przykładzie przeglądarka jest poinstruowana, aby uwidoczniła dowolny nagłówek rozpoczynający się od
x-ms-meta
.MaxAgeInSeconds: maksymalny czas buforowania żądania OPTIONS w przeglądarce.
Usługi magazynu platformy Azure obsługują określanie prefiksów nagłówków dla elementów AllowedHeaders i ExposedHeaders . Aby zezwolić na kategorię nagłówków, można określić wspólny prefiks tej kategorii. Na przykład określenie x-ms-meta*
jako prefiksu nagłówka ustanawia regułę, która będzie zgodna ze x-ms-meta
wszystkimi nagłówkami rozpoczynającymi się od .
Następujące ograniczenia dotyczą reguł CORS:
Można określić maksymalnie pięć reguł CORS na usługę magazynu (obiekt blob, plik, tabela i kolejka).
Maksymalny rozmiar wszystkich ustawień reguł CORS dla żądania, z wyłączeniem tagów XML, nie powinien przekraczać 2 KiB.
Długość dozwolonego nagłówka, uwidocznionego nagłówka lub dozwolonego źródła nie powinna przekraczać 256 znaków.
Dozwolone nagłówki i uwidocznione nagłówki mogą być następujące:
- Nagłówki literału, w których podano dokładną nazwę nagłówka, takie jak x-ms-meta-processed. W żądaniu można określić maksymalnie 64 nagłówki literału.
- Prefiksy nagłówków, w których podano prefiks nagłówka, taki jak x-ms-meta-data*. Określenie prefiksu w ten sposób umożliwia lub uwidacznia dowolny nagłówek rozpoczynający się od danego prefiksu. W żądaniu można określić maksymalnie dwa prefiksy nagłówków.
Metody (lub czasowniki HTTP) określone w elemecie AllowedMethods muszą być zgodne z metodami obsługiwanymi przez interfejsy API usługi Azure Storage. Obsługiwane metody to DELETE, GET, HEAD, MERGE, POST, PATCH, OPTIONS i PUT.
Opis logiki oceny reguł CORS
Gdy usługa magazynu odbiera wstępne lub rzeczywiste żądanie, ocenia to żądanie na podstawie reguł CORS ustanowionych dla usługi za pośrednictwem odpowiedniej operacji Ustaw właściwości usługi. Reguły CORS są oceniane w kolejności, w której zostały ustawione w treści żądania operacji Ustawianie właściwości usługi.
Reguły CORS są oceniane w następujący sposób:
Najpierw domena pochodzenia żądania jest sprawdzana względem domen wymienionych dla
AllowedOrigins
elementu . Jeśli domena pochodzenia znajduje się na liście lub wszystkie domeny są dozwolone z symbolem wieloznacznymi "*", ocena reguł będzie kontynuowana. Jeśli domena źródła nie jest dołączona, żądanie zakończy się niepowodzeniem.Następnie metoda (lub czasownik HTTP) żądania jest sprawdzana względem metod wymienionych w elemecie
AllowedMethods
. Jeśli metoda znajduje się na liście, ocena reguł będzie kontynuowana; jeśli nie, żądanie zakończy się niepowodzeniem.Jeśli żądanie pasuje do reguły w domenie pochodzenia i jej metodzie, ta reguła zostanie wybrana do przetworzenia żądania i nie zostaną ocenione żadne dalsze reguły. Zanim żądanie zakończy się pomyślnie, wszystkie nagłówki określone w żądaniu są sprawdzane względem nagłówków wymienionych w elemecie
AllowedHeaders
. Jeśli wysłane nagłówki nie pasują do dozwolonych nagłówków, żądanie zakończy się niepowodzeniem.
Ponieważ reguły są przetwarzane w kolejności, w której znajdują się w treści żądania, najlepsze rozwiązania zaleca określenie najbardziej restrykcyjnych reguł w odniesieniu do źródeł na liście, tak aby były one oceniane jako pierwsze. Określ reguły, które są mniej restrykcyjne — na przykład reguła zezwala na wszystkie źródła — na końcu listy.
Przykład — ocena reguł CORS
Poniższy przykład przedstawia częściową treść żądania dla operacji ustawiania reguł CORS dla usług magazynu. Zobacz Ustawianie właściwości usługi Blob Service, Ustawianie właściwości usługi plików, Ustawianie właściwości usługi kolejki i Ustawianie właściwości usługi Table Service , aby uzyskać szczegółowe informacje na temat konstruowania żądania.
<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>
Następnie rozważ następujące żądania CORS:
Metoda | Origin | Nagłówki żądań | Dopasowanie reguły | Wynik |
---|---|---|---|---|
PUT | http://www.contoso.com |
x-ms-blob-content-type |
Pierwsza reguła | Powodzenie |
GET | http://www.contoso.com |
x-ms-blob-content-type |
Druga reguła | Powodzenie |
GET | http://www.contoso.com |
x-ms-client-request-id |
Druga reguła | Niepowodzenie |
Pierwsze żądanie jest zgodne z pierwszą regułą — domena pochodzenia jest zgodna z dozwolonymi źródłami, metoda jest zgodna z dozwolonymi metodami, a nagłówek pasuje do dozwolonych nagłówków — i tak się powiedzie.
Drugie żądanie nie jest zgodne z pierwszą regułą, ponieważ metoda nie jest zgodna z dozwolonymi metodami. Jest to jednak zgodne z drugą regułą, więc się powiedzie.
Trzecie żądanie jest zgodne z drugą regułą w domenie i metodzie pochodzenia, więc nie są oceniane żadne dalsze reguły.
x-ms-client-request-id
Jednak nagłówek nie jest dozwolony przez drugą regułę, więc żądanie kończy się niepowodzeniem, pomimo faktu, że semantyka trzeciej reguły umożliwiłaby jej powodzenie.
Uwaga
Chociaż w tym przykładzie przedstawiono mniej restrykcyjną regułę przed bardziej restrykcyjnym, najlepszym rozwiązaniem jest najpierw wyświetlenie listy najbardziej restrykcyjnych reguł.
Informacje na temat ustawiania nagłówka Vary
Nagłówek Vary
jest standardowym nagłówkiem HTTP/1.1 składającym się z zestawu pól nagłówka żądania, które informują przeglądarkę lub agenta użytkownika o kryteriach wybranych przez serwer w celu przetworzenia żądania. Nagłówek Vary
jest używany głównie do buforowania przez serwery proxy, przeglądarki i sieci CDN, które używają go do określenia sposobu buforowania odpowiedzi. Aby uzyskać szczegółowe informacje, zobacz specyfikację nagłówka Vary.
Gdy przeglądarka lub inny agent użytkownika buforuje odpowiedź z żądania CORS, domena pochodzenia jest buforowana jako dozwolone źródło. Gdy druga domena wystawia to samo żądanie zasobu magazynu, gdy pamięć podręczna jest aktywna, agent użytkownika pobiera buforowanej domeny źródła. Druga domena nie jest zgodna z domeną buforowanej, więc żądanie kończy się niepowodzeniem, gdy w przeciwnym razie powiedzie się. W niektórych przypadkach usługa Azure Storage ustawia Vary
nagłówek, aby Origin
polecił agentowi użytkownika wysłanie kolejnego żądania CORS do usługi, gdy domena żądająca różni się od buforowanego źródła.
Usługa Azure Storage ustawia Vary
nagłówek na Origin
wartość dla rzeczywistych żądań GET/HEAD w następujących przypadkach:
Gdy źródło żądania dokładnie pasuje do dozwolonego źródła zdefiniowanego przez regułę MECHANIZMU CORS. Aby być dokładnym dopasowaniem, reguła CORS może nie zawierać symbolu wieloznakowego "*".
Nie ma reguły pasującej do źródła żądania, ale mechanizm CORS jest włączony dla usługi magazynu.
W przypadku, gdy żądanie GET/HEAD pasuje do reguły CORS, która zezwala na wszystkie źródła, odpowiedź wskazuje, że wszystkie źródła są dozwolone, a pamięć podręczna agenta użytkownika zezwoli na kolejne żądania z dowolnej domeny pochodzenia, gdy pamięć podręczna jest aktywna.
Należy pamiętać, że w przypadku żądań korzystających z metod innych niż GET/HEAD usługi magazynu nie będą ustawiać nagłówka Vary
, ponieważ odpowiedzi na te metody nie są buforowane przez agentów użytkowników.
W poniższej tabeli przedstawiono sposób reagowania usługi Azure Storage na żądania GET/HEAD w oparciu o wymienione wcześniej przypadki:
Nagłówek origin obecny na żądanie | Reguły CORS określone dla tej usługi | Istnieje reguła dopasowania, która zezwala na wszystkie źródła (*) | Reguła dopasowania istnieje dla dokładnego dopasowania pochodzenia | Odpowiedź zawiera różne nagłówki ustawione na źródło | Odpowiedź obejmuje dostęp do kontroli dostępu dozwolone źródło: "*" | Odpowiedź zawiera nagłówki Access-Control-Exposed-Headers |
---|---|---|---|---|---|---|
Nie | Nie | Nie | Nie | Nie | Nie | Nie |
Nie | Tak | Nie | Nie | Tak | Nie | Nie |
Nie | Tak | Tak | Nie | Nie | Tak | Tak |
Tak | Nie | Nie | Nie | Nie | Nie | Nie |
Tak | Tak | Nie | Tak | Tak | Nie | Tak |
Tak | Tak | Nie | Nie | Tak | Nie | Nie |
Tak | Tak | Tak | Nie | Nie | Tak | Tak |
Rozliczenia dla żądań CORS
Pomyślne żądania wstępne są rozliczane, jeśli włączono mechanizm CORS dla dowolnego z usług magazynowania dla konta (wywołując polecenie Ustaw właściwości usługi Blob Service, Ustaw właściwości usługi kolejki, Ustaw właściwości usługi plików lub Ustaw właściwości usługi tabel). Aby zminimalizować opłaty, rozważ ustawienie MaxAgeInSeconds
elementu w regułach CORS na dużą wartość, aby agent użytkownika buforować żądanie.
Nieudane żądania wstępne nie zostaną naliczone.