Azure Depolama için Çıkış Noktaları Arası Kaynak Paylaşımı (CORS) desteği
2013-08-15 sürümünden başlayarak, Azure depolama hizmetleri Blob, Tablo ve Kuyruk hizmetleri için Çıkış Noktaları Arası Kaynak Paylaşımı'nı (CORS) destekler. Dosya hizmeti, 2015-02-21 sürümünden itibaren CORS'yi destekler.
CORS, başka bir etki alanındaki kaynaklara erişmek için bir etki alanı altında çalışan bir web uygulamasını etkinleştiren bir HTTP özelliğidir. Web tarayıcıları, bir web sayfasının farklı bir etki alanındaki API'leri çağırmasını engelleyen , aynı kaynak ilkesi olarak bilinen bir güvenlik kısıtlaması uygular; CORS, bir etki alanının (kaynak etki alanı) başka bir etki alanındaki API'leri çağırmasına izin vermek için güvenli bir yol sağlar. CORS ile ilgili ayrıntılar için bkz. CORS belirtimi .
Blob Hizmeti Özelliklerini Ayarla, Dosya Hizmeti Özelliklerini Ayarla, Kuyruk Hizmeti Özelliklerini Ayarla ve Tablo Hizmeti Özelliklerini Ayarla'yı çağırarak Azure Depolama hizmetlerinin her biri için CORS kurallarını ayrı ayrı ayarlayabilirsiniz. Hizmet için CORS kurallarını ayarladıktan sonra farklı bir etki alanından hizmete yapılan, uygun yetkilere sahip bir istek değerlendirmeye alınır. Bu değerlendirme, isteğe belirttiğiniz kurallara uygun olarak izin verilip verilmediğini belirler.
Önemli
CORS bir yetkilendirme mekanizması değildir. CORS etkinleştirildiğinde bir depolama kaynağına yönelik yapılan tüm isteklerin geçerli bir yetkilendirme üst bilgisi olması veya genel bir kaynakta yapılması gerekir.
CORS, premium performans katmanındaki genel amaçlı v1 veya v2 depolama hesapları dışında tüm depolama hesabı türleri için desteklenir.
CORS isteklerini anlama
Bir kaynak etki alanından gelen CORS isteği iki ayrı istekten oluşabilir:
Hizmet tarafından uygulanan CORS kısıtlamalarını sorgulayan bir denetim öncesi isteği. İstek yöntemi GET, HEAD veya POST gibi basit bir yöntem olmadığı sürece denetim öncesi isteği gereklidir.
İstenen kaynağa yönelik gerçek istek.
Denetim öncesi isteği
Denetim öncesi isteği, hesap sahibi tarafından depolama hizmeti için oluşturulan CORS kısıtlamalarını sorgular. Web tarayıcısı (veya diğer kullanıcı aracısı), istek üst bilgilerini, yöntemini ve kaynak etki alanını içeren bir OPTIONS isteği gönderir. Depolama hizmeti, hedeflenen işlemi, depolama kaynağına yönelik gerçek bir istekte hangi kaynak etki alanlarının, istek yöntemlerinin ve istek üst bilgilerinin belirtilebileceğini belirten önceden yapılandırılmış bir CORS kuralları kümesine göre değerlendirir.
Hizmet için CORS etkinleştirildiyse ve denetim öncesi isteğiyle eşleşen bir CORS kuralı varsa, hizmet durum kodu 200 (Tamam) ile yanıt verir ve yanıtta gerekli Access-Control üst bilgilerini içerir.
Hizmet için CORS etkin değilse veya denetim öncesi isteğiyle eşleşen CORS kuralı yoksa, hizmet 403 (Yasak) durum koduyla yanıt verir.
SEÇENEKLER isteği gerekli CORS üst bilgilerini (Origin ve Access-Control-Request-Method üst bilgileri) içermiyorsa, hizmet durum kodu 400 (Hatalı istek) ile yanıt verir.
Denetim öncesi isteğinin istenen kaynakta değil hizmet (Blob, Dosya, Kuyruk veya Tablo) için değerlendirildiğini unutmayın. İsteğin başarılı olması için uygun hesap hizmeti özelliklerini ayarlayarak hesap sahibinin CORS'yi etkinleştirmiş olması gerekir.
Gerçek istek
Denetim öncesi isteği kabul edildikten ve yanıt döndürüldükten sonra tarayıcı gerçek isteği depolama kaynağına gönderir. Denetim öncesi isteği reddedilirse tarayıcı gerçek isteği hemen reddeder.
Gerçek istek, depolama hizmetine karşı normal istek olarak kabul edilir. Origin üst bilgisinin varlığı isteğin bir CORS isteği olduğunu ve hizmetin eşleşen CORS kurallarını denetlediğini gösterir. Eşleşme bulunursa, Access-Control üst bilgileri yanıta eklenir ve istemciye geri gönderilir. Eşleşme bulunamazsa CORS Access-Control üst bilgileri döndürülür.
Azure Depolama için CORS'yi etkinleştirme
CORS kuralları hizmet düzeyinde ayarlanır, bu nedenle her hizmet (Blob, Dosya, Kuyruk ve Tablo) için CORS'yi ayrı olarak etkinleştirmeniz veya devre dışı bırakmanız gerekir. Varsayılan olarak CORS her hizmette devre dışı bırakılmıştır. CORS'yi etkinleştirmek için Blob, Kuyruk ve Tablo hizmetleri veya sürüm 2015-02-21 veya Dosya hizmeti için sürüm 2013-08-15 veya üzerini kullanarak uygun hizmet özelliklerini ayarlamanız gerekir. Hizmet özelliklerine CORS kuralları ekleyerek CORS'yi etkinleştirebilirsiniz. Bir hizmet için CORS'yi etkinleştirme veya devre dışı bırakma ve CORS kurallarını ayarlama hakkında ayrıntılı bilgi için bkz. Blob Hizmeti Özelliklerini Ayarlama, Dosya Hizmeti Özelliklerini Ayarlama, Tablo Hizmeti Özelliklerini Ayarlama ve Kuyruk Hizmeti Özelliklerini Ayarlama.
Aşağıda, bir işlem aracılığıyla belirtilen tek bir CORS kuralının örneği Set Service Properties
verilmiştir:
<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>
CORS kuralına dahil edilen her öğe aşağıda açıklanmıştır:
AllowedOrigins: CORS aracılığıyla depolama hizmetine yönelik istekte bulunmalarına izin verilen kaynak etki alanları. Kaynak etki alanı, isteğin kaynaklandığı etki alanıdır. Kaynağın, kullanıcı yaşının hizmete gönderdiği kaynakla tam olarak büyük/küçük harfe duyarlı bir eşleşme olması gerektiğini unutmayın.
Tüm kaynak etki alanlarının CORS aracılığıyla istekte bulunmalarına izin vermek için belirtilen etki alanının yerine '*' joker karakterini kullanabilirsiniz. Belirli bir etki alanının tüm alt etki alanlarının CORS aracılığıyla istekte bulunmalarına izin vermek için bir alt etki alanının yerine joker karakteri de kullanabilirsiniz. Yukarıdaki örnekte, tüm alt etki alanları
contoso.com
CORS aracılığıyla istekte bulunabilirken yalnızca alt etkifabrikam.com
alanındanwww
gelen isteklere CORS aracılığıyla izin verilir.AllowedMethods: Kaynak etki alanının bir CORS isteği için kullanabileceği yöntemler (HTTP istek fiilleri). Yukarıdaki örnekte yalnızca PUT ve GET isteklerine izin verilir.
AllowedHeaders: Kaynak etki alanının CORS isteğinde belirtebileceği istek üst bilgileri. Yukarıdaki örnekte, ,
x-ms-meta-target
vex-ms-meta-abc
ilex-ms-meta-data
başlayan tüm meta veri üst bilgilerine izin verilir. '*' joker karakterinin, belirtilen ön ekle başlayan herhangi bir üst bilgiye izin verildiğini gösterdiğini unutmayın.ExposedHeaders: CORS isteğine yanıt olarak gönderilebilen ve tarayıcı tarafından istek verene gösterilebilen yanıt üst bilgileri. Yukarıdaki örnekte, tarayıcıya ile
x-ms-meta
başlayan herhangi bir üst bilgiyi kullanıma sunma talimatı verilmiştir.MaxAgeInSeconds: Tarayıcının denetim öncesi OPTIONS isteğini önbelleğe alması gereken en uzun süre.
Azure depolama hizmetleri, hem AllowedHeaders hem de ExposedHeaders öğeleri için ön ekli üst bilgiler belirtmeyi destekler. Üst bilgi kategorisine izin vermek için, bu kategoriye ortak bir ön ek belirtebilirsiniz. Örneğin, ön ekli üst bilgi olarak belirtilmesi x-ms-meta*
, ile başlayan tüm üst bilgilerle x-ms-meta
eşleşecek bir kural oluşturur.
CORS kuralları için aşağıdaki sınırlamalar geçerlidir:
Depolama hizmeti başına en fazla beş CORS kuralı belirtebilirsiniz (Blob, Dosya, Tablo ve Kuyruk).
XML etiketleri hariç, istek üzerindeki tüm CORS kuralları ayarlarının boyut üst sınırı 2 KiB'ı aşmamalıdır.
İzin verilen üst bilgi, kullanıma sunulan üst bilgi veya izin verilen kaynağın uzunluğu 256 karakteri aşmamalıdır.
İzin verilen üst bilgiler ve kullanıma sunulan üst bilgiler aşağıdakilerden biri olabilir:
- X-ms-meta-processed gibi tam üst bilgi adının sağlandığı değişmez başlıklar. İstekte en fazla 64 değişmez değer üst bilgisi belirtilebilir.
- Ön ekli üst bilgiler; burada x-ms-meta-data* gibi üst bilgi ön eki sağlanır. Bir ön ekin bu şekilde belirtilmesi, belirtilen ön ekle başlayan üst bilgileri sağlar veya kullanıma sunar. İstekte en fazla iki ön ekli üst bilgi belirtilebilir.
AllowedMethods öğesinde belirtilen yöntemler (veya HTTP fiilleri), Azure depolama hizmeti API'leri tarafından desteklenen yöntemlere uygun olmalıdır. Delete, GET, HEAD, MERGE, POST, PATCH, OPTIONS ve PUT yöntemleri desteklenir.
CORS kuralı değerlendirme mantığını anlama
Depolama hizmeti bir denetim öncesi veya gerçek istek aldığında, uygun Hizmet Özelliklerini Ayarla işlemi aracılığıyla hizmet için oluşturduğunuz CORS kurallarına göre bu isteği değerlendirir. CORS kuralları, Hizmet Özelliklerini Ayarla işleminin istek gövdesinde ayarlandığı sırayla değerlendirilir.
CORS kuralları aşağıdaki gibi değerlendirilir:
İlk olarak, isteğin kaynak etki alanı öğesi için listelenen etki alanlarında denetlenır
AllowedOrigins
. Kaynak etki alanı listeye dahil edilirse veya tüm etki alanlarına '*' joker karakteriyle izin verilirse, kural değerlendirmesi devam eder. Kaynak etki alanı dahil değilse istek başarısız olur.Ardından, isteğin yöntemi (veya HTTP fiili) öğesinde listelenen yöntemlere karşı denetlenır
AllowedMethods
. Yöntem listeye dahil edilirse, kural değerlendirmesi devam eder; aksi takdirde istek başarısız olur.İstek, kaynak etki alanındaki ve yöntemindeki bir kuralla eşleşiyorsa, isteği işlemek için bu kural seçilir ve başka kural değerlendirilmez. Ancak istek başarılı olmadan önce, istekte belirtilen tüm üst bilgiler öğesinde
AllowedHeaders
listelenen üst bilgilerle karşılaştırılır. Gönderilen üst bilgiler izin verilen üst bilgilerle eşleşmiyorsa istek başarısız olur.
Kurallar istek gövdesinde mevcut oldukları sırayla işlendiği için, en iyi yöntemler listede ilk olarak kaynaklarla ilgili en kısıtlayıcı kuralları belirtmenizi ve böylece bunların önce değerlendirilmesini önerir. Listenin sonunda daha az kısıtlayıcı kurallar (örneğin, tüm kaynaklara izin veren bir kural) belirtin.
Örnek – CORS kuralları değerlendirmesi
Aşağıdaki örnekte, depolama hizmetleri için CORS kuralları ayarlama işleminin kısmi istek gövdesi gösterilmektedir. İsteği oluşturmayla ilgili ayrıntılar için bkz. Blob Hizmeti Özelliklerini Ayarlama, Dosya Hizmeti Özelliklerini Ayarlama, Kuyruk Hizmeti ÖzellikleriniAyarlama ve Tablo Hizmeti Özelliklerini Ayarlama .
<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>
Ardından aşağıdaki CORS isteklerini göz önünde bulundurun:
Yöntem | Kaynak | İstek üst bilgileri | Kural Eşleştirme | Sonuç |
---|---|---|---|---|
PUT | http://www.contoso.com |
x-ms-blob-content-type |
İlk kural | Başarılı |
GET | http://www.contoso.com |
x-ms-blob-content-type |
İkinci kural | Başarılı |
GET | http://www.contoso.com |
x-ms-client-request-id |
İkinci kural | Hata |
İlk istek ilk kuralla eşleşir ; kaynak etki alanı izin verilen kaynaklarla eşleşir, yöntem izin verilen yöntemlerle, üst bilgi de izin verilen üst bilgilerle eşleşir ve bu nedenle başarılı olur.
yöntem izin verilen yöntemlerle eşleşmediğinden ikinci istek ilk kuralla eşleşmiyor. Ancak, ikinci kuralla eşleşdiğinden başarılı olur.
Üçüncü istek, kaynak etki alanı ve yöntemindeki ikinci kuralla eşleşir, bu nedenle başka kural değerlendirilmez. Ancak, x-ms-client-request-id
üst bilgi ikinci kural tarafından izin verilmez, bu nedenle üçüncü kuralın semantiğinin başarılı olmasına izin vermesine rağmen istek başarısız olur.
Not
Bu örnek daha kısıtlayıcı bir kuraldan önce daha az kısıtlayıcı bir kural gösterse de, genel olarak en iyi yöntem öncelikle en kısıtlayıcı kuralları listelemektir.
Vary üst bilgisinin nasıl ayarlandığını anlama
Üst Vary
bilgi, tarayıcıya veya kullanıcı aracısına isteği işlemek için sunucu tarafından seçilen ölçütleri öneren bir dizi istek üst bilgisi alanından oluşan standart bir HTTP/1.1 üst bilgisidir. Üst bilgi çoğunlukla proxy'ler Vary
, tarayıcılar ve CDN'ler tarafından önbelleğe almak için kullanılır ve bu da yanıtın nasıl önbelleğe alınması gerektiğini belirlemek için kullanılır. Ayrıntılar için Vary üst bilgisinin belirtimine bakın.
Tarayıcı veya başka bir kullanıcı aracısı bir CORS isteğinden gelen yanıtı önbelleğe alırsa, kaynak etki alanı izin verilen kaynak olarak önbelleğe alınır. İkinci bir etki alanı önbellek etkinken depolama kaynağı için aynı isteği gönderirse, kullanıcı aracısı önbelleğe alınmış kaynak etki alanını alır. İkinci etki alanı önbelleğe alınmış etki alanıyla eşleşmiyor, bu nedenle istek aksi takdirde başarılı olduğunda başarısız oluyor. Bazı durumlarda Azure Depolama, istekte bulunan etki alanı önbelleğe Origin
alınan kaynaktan farklı olduğunda kullanıcı aracısına sonraki CORS isteğini hizmete göndermesini bildirmek için üst bilgiyi olarak ayarlarVary
.
Azure Depolama, aşağıdaki durumlarda gerçek GET/HEAD istekleri için üst bilgiyi Origin
olarak ayarlarVary
:
İstek kaynağı bir CORS kuralı tarafından tanımlanan izin verilen kaynakla tam olarak eşleştiğinde. Tam eşleşme olması için, CORS kuralı '*' joker karakteri içermeyebilir.
İstek kaynağıyla eşleşen bir kural yoktur, ancak depolama hizmeti için CORS etkindir.
GET/HEAD isteğinin tüm kaynaklara izin veren bir CORS kuralıyla eşleşmesi durumunda, yanıt tüm kaynaklara izin verileceğini gösterir ve kullanıcı aracısı önbelleği, önbellek etkinken herhangi bir kaynak etki alanından gelen sonraki isteklere izin verir.
GET/HEAD dışındaki yöntemleri kullanan istekler için, bu yöntemlere yönelik yanıtlar kullanıcı aracıları tarafından önbelleğe alınmadığından depolama hizmetlerinin üst bilgiyi ayarlamayacağını Vary
unutmayın.
Aşağıdaki tabloda, Azure depolamanın daha önce bahsedilen durumlara göre GET/HEAD isteklerine nasıl yanıt vereceği gösterilir:
İstekte kaynak üst bilgisi var | Bu hizmet için belirtilen CORS kuralları | Tüm çıkış noktalarına (*) izin veren eşleşen kural var | Tam kaynak eşleşmesi için eşleştirme kuralı var | Yanıt, Kaynak olarak ayarlanan Vary üst bilgisini içerir | Yanıt access-control-allowed-origin içerir: "*" | Yanıt, Access-Control-Exposed-Headers içerir |
---|---|---|---|---|---|---|
Hayır | Hayır | Hayır | Hayır | Hayır | Hayır | Hayır |
Hayır | Yes | Hayır | Hayır | Yes | Hayır | Hayır |
Hayır | Yes | Yes | Hayır | Hayır | Yes | Yes |
Yes | Hayır | Hayır | Hayır | Hayır | Hayır | Hayır |
Yes | Yes | Hayır | Yes | Yes | Hayır | Yes |
Yes | Yes | Hayır | Hayır | Yes | Hayır | Hayır |
Yes | Yes | Yes | Hayır | Hayır | Yes | Yes |
CORS istekleri için faturalama
Hesabınız için depolama hizmetlerinden herhangi biri için CORS'yi etkinleştirdiyseniz (Blob Hizmeti Özelliklerini Ayarla, Kuyruk Hizmeti Özelliklerini Ayarla, Dosya Hizmeti Özelliklerini Ayarla veya Tablo Hizmeti Özelliklerini Ayarla çağrısı yaparak) başarılı denetim öncesi istekleri faturalandırılır. Ücretleri en aza indirmek için CORS kurallarınızdaki öğeyi MaxAgeInSeconds
, kullanıcı aracısının isteği önbelleğe alabilmesi için büyük bir değere ayarlamayı göz önünde bulundurun.
Başarısız denetim öncesi istekleri faturalandırılmaz.