Paylaşılan REST API yetkilendirmesi ile çağrı ve işlem
Bu makalede, Yetkilendirme üst bilgisi de dahil olmak Depolama REST API'leri için Azure Depolama çağırma hakkında bilgi ve bilgiler yer alır. REST hakkında hiçbir şey bilmiyor ve REST çağrısı yapma konusunda hiçbir fikri olan bir geliştiricinin bakış açısından yazılmıştır. REST işlemi çağırmayı öğrendikten sonra bu bilgilerden faydalanarak rest işlemleriyle ilgili diğer Azure Depolama kullanabilirsiniz.
Önkoşullar
Örnek uygulama, bir depolama hesabının blob kapsayıcılarını listeler. Bu makaledeki kodu denemek için aşağıdaki öğelere ihtiyacınız vardır:
Azure Visual Studio iş yüküyle 2019'da yükleme.
Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Genel amaçlı depolama hesabı. Henüz bir depolama hesabınız yoksa bkz. Depolama hesabı oluşturma.
Bu makaledeki örnekte, bir depolama hesabı içinde kapsayıcıların nasıl listelen bir listesi olduğu gösterir. Çıktıyı görmek için başlamadan önce depolama hesabında blob depolama alanına bazı kapsayıcılar ekleyin.
Örnek uygulamayı indirin:
Örnek uygulama, C# ile yazılmış bir konsol uygulamasıdır.
Uygulamanın bir kopyasını geliştirme ortamınıza indirmek için Git'i kullanın.
git clone https://github.com/Azure-Samples/storage-dotnet-rest-api-with-auth.git
Bu komut, depoyu yerel Git klasörünüze kopyalar. Visual Studio için storage-dotnet-rest-api-with-auth klasörünü açın, açın ve StorageRestApiAuth.sln'ye çift tıklayın.
REST hakkında
REST, temsili durum aktarımı anlamına geldi. Belirli bir tanım için Wikipedia'ya göz at.
REST, HTTP/HTTPS gibi bir İnternet protokolü üzerinden bir hizmetle etkileşim kurmanızı sağlayan bir mimaridir. REST, sunucuda veya istemcide çalışan yazılımdan bağımsızdır. Bu REST API HTTP/HTTPS destekleyen herhangi bir platformdan çağrılabilirsiniz. Mac, Windows, Linux, Android telefon veya tablet, iPhone, iPod veya web sitesinde çalışan bir uygulama yazabilir ve tüm bu platformlar için aynı REST API'yi kullanabilirsiniz.
REST API çağrısı, istemci tarafından yapılan bir istekten ve hizmet tarafından döndürülen yanıtlardan oluşur. İstekte, hangi işlemi, işlem için gerekli kaynağı, sorgu parametrelerini ve üst bilgileri ve çağrılan işleme bağlı olarak veri yüküyle ilgili bilgileri olan bir URL gönderirsiniz. Hizmetten gelen yanıt bir durum kodu, bir dizi yanıt üst bilgisi ve çağrılan işleme bağlı olarak bir veri yükü içerir.
Örnek uygulama hakkında
Örnek uygulama, bir depolama hesabı içinde kapsayıcıları listeler. REST API belgelerinde yer alan bilgilerin gerçek kodunuzla nasıl ilişkili olduğunu antiktan sonra, diğer REST çağrılarını daha kolay anlıyoruz.
Blobdepolama alanına Hizmet REST API'si, blob depolamada gerçekleştir all işlemlerinin olduğunu görebilir. Depolama istemci kitaplıkları REST API'lerinin çevresindeki sarmalayıcılardır ve REST API'leri doğrudan kullanmadan depolamaya erişmeyi kolaylaştırır. Ancak yukarıda belirtildiği gibi, bazen depolama istemci kitaplığı yerine REST API'sini kullanmak istiyor oluruz.
Kapsayıcıları Listele işlemi
ListContainers işlemi için başvuru gözden geçirme. Bu bilgiler, istek ve yanıtta bazı alanların nereden olduğunu anlamanıza yardımcı olur.
İstek Yöntemi: GET. Bu fiil, istek nesnesinin özelliği olarak belirttiğiniz HTTP yöntemidir. Bu fiilin diğer değerleri, çağıran API'ye bağlı olarak HEAD, PUT ve DELETE'tir.
İstek URI'si: https://myaccount.blob.core.windows.net/?comp=list . İstek URI'si blob depolama hesabı uç noktası ve https://myaccount.blob.core.windows.net kaynak dizesinden /?comp=list oluşturulur.
URI parametreleri:ListContainers çağrılırken kullanabileceğiniz ek sorgu parametreleri vardır. Bu parametrelerden birkaçı, filtreleme için kullanılan çağrı (saniye olarak) ve ön ek için zaman aşımıdır.
Bir diğer yararlı parametre maxresults parametresidir: Bu değerden daha fazla kapsayıcı varsa yanıt gövdesi, sonraki istekte geri dönecek sonraki kapsayıcıyı belirten bir NextMarker öğesi içerir. Bu özelliği kullanmak için, sonraki isteği URI'de işaretçi parametresi olarak NextMarker değerini sağlar. Bu özellik kullanırken, sonuçlar aracılığıyla disk belleğine benzer.
Ek parametreleri kullanmak için, bunları değeriyle kaynak dizesine şu örnekte olduğu gibi ekini girin:
/?comp=list&timeout=60&maxresults=100
İstek Üst Bilgileri: Bu bölüm, gerekli ve isteğe bağlı istek üst bilgilerini listeler. Üst bilgilerden üçü gereklidir: Yetkilendirme üst bilgisi, x-ms-date (isteğin UTC saatini içerir) ve x-ms-version (kullanmak istediğiniz REST API belirtir). x-ms-client-request-id değerini üst bilgilerde dahil etmek isteğe bağlıdır; bu alanın değerini herhangi bir değer olarak ayarlayın; Günlük kaydı etkinleştirildiğinde depolama analiz günlüklerine yazılır.
İstek Gövdesi: ListContainers için istek gövdesi yoktur. İstek Gövdesi, blobları karşıya yüklerken put işlemlerinin yanı sıra uygulanacak depolanmış erişim ilkelerinin BIR XML listesinde göndermenizi sağlayan SetContainerAccessPolicy'de kullanılır. Depolanan erişim ilkeleri, Paylaşılan Erişim İmzaları (SAS) Kullanma makalesinde ele alınmıştır.
Yanıt Durum Kodu: Bilmek zorunda olduğunu tüm durum kodlarını söyler. Bu örnekte 200 HTTP durum kodu tamamdır. HTTP durum kodlarının tam listesi için Bkz. Durum Kodu Tanımları. Rest API'lere özgü hata Depolama görmek için bkz. Genel REST API kodları
Yanıt Üst Bilgileri:Bunlar İçerik Türünü içerir; x-ms-request-id, geçirilen istek kimliğidir; Kullanılan Blob hizmetinin sürümünü gösteren x-ms-version; ve UTC'de olan ve isteğin ne zaman olduğunu söyleyen Tarih.
Yanıt Gövdesi:Bu alan, istenen verileri sağlayan bir XML yapısıdır. Bu örnekte yanıt, kapsayıcıların ve özelliklerinin bir listesidir.
REST isteğini oluşturma
Üretimde çalışan güvenlik için her zaman HTTP yerine HTTPS kullanın. Bu alıştırmanın amaçları doğrultusunda, istek ve yanıt verilerini görüntülemek için HTTP kullan gerekir. Gerçek REST çağrılarında istek ve yanıt bilgilerini görüntülemek için Fiddler'ı veya benzer bir uygulamayı indirebilirsiniz. Depolama Visual Studio, depolama hesabı adı ve anahtarı sınıfında sabit kodlar. ListContainersAsyncREST yöntemi, depolama hesabı adını ve depolama hesabı anahtarını REST isteğinin çeşitli bileşenlerini oluşturmak için kullanılan yöntemlere iletir. Gerçek dünya uygulamasında depolama hesabı adı ve anahtarı bir yapılandırma dosyasında, ortam değişkensinde yer alabilir veya bir Azure Key Vault.
Örnek projemizde Yetkilendirme üst bilgisi oluşturma kodu ayrı bir sınıftadır. Burada fikir, sınıfın tamamını alıp kendi çözümünüze ekleyebilir ve "olduğu gibi" kullanabilirsiniz. Yetkilendirme üst bilgisi kodu, Azure REST API çoğu çağrıda Depolama.
HttpRequestMessage nesnesi olan isteği oluşturmak için Program.cs içinde ListContainersAsyncREST'e gidin. İsteğin nasıl hazır olduğu şu şekildedir:
- Hizmeti çağırmada kullanılacak URI'yi oluşturun.
- HttpRequestMessage nesnesini oluşturun ve yükü ayarlayın. ListContainersAsyncREST için yük null çünkü hiçbir şey geçirmeziz.
- x-ms-date ve x-ms-version için istek üst bilgilerini ekleyin.
- Yetkilendirme üst bilgilerini al ve ekle.
Gereken bazı temel bilgiler:
- ListContainers için yöntemi şu şekildedir:
GET. Bu değer, isteğin örneği hazırlarken ayarlanır. - Kaynak, URI'nin çağrılan API'yi belirten sorgu bölümü olduğu için değeri
/?comp=listolur. Daha önce belirtildiği gibi, kaynak ListContainers API'siile ilgili bilgileri gösteren başvuru belgeleri sayfasındadır. - URI, bu depolama hesabı için Blob hizmeti uç noktasının oluşturulması ve kaynağın bir oluşturulmasıyla oluşturulur. İstek URI'sı değeri
http://contosorest.blob.core.windows.net/?comp=listolur. - ListContainers için requestBody null olur ve ek üst bilgi yoktur.
Farklı API'lerde, ifMatch gibi geçiş için başka parametreler olabilir. PutBlob çağrılırken ifMatch kullanabileceğiniz bir örnektir. Bu durumda, ifMatch'i bir eTag olarak ayarlayabilirsiniz ve yalnızca, size sağlandı eTag'in blobda geçerli eTag ile eşleşmesi durumunda blobu günceller. eTag'i aldıktan sonra başka biri blobu güncelleştirilmişse, değişikliği geçersiz kılınmaz.
İlk olarak ve uri 'i payload ayarlayın.
// Construct the URI. It will look like this:
// https://myaccount.blob.core.windows.net/resource
String uri = string.Format("http://{0}.blob.core.windows.net?comp=list", storageAccountName);
// Provide the appropriate payload, in this case null.
// we're not passing anything in.
Byte[] requestPayload = null;
Ardından, yöntemini olarak ayarp URI'yi sağlayarak GET isteğin örneğini seçin.
// Instantiate the request message with a null payload.
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri)
{ Content = (requestPayload == null) ? null : new ByteArrayContent(requestPayload) })
{
ve için istek üst bilgilerini x-ms-date x-ms-version ekleyin. Kodda bu yer, çağrı için gereken ek istek üst bilgilerini de ek olarak eklediğimiz yerdir. Bu örnekte ek üst bilgi yoktur. Kapsayıcı ACL'sini Ayarlama işlemi, ek üst bilgilerden geçen bir API örneğidir. Bu API çağrısı, "x-ms-blob-public-access" adlı bir üst bilgi ve erişim düzeyi için değer ekler.
// Add the request headers for x-ms-date and x-ms-version.
DateTime now = DateTime.UtcNow;
httpRequestMessage.Headers.Add("x-ms-date", now.ToString("R", CultureInfo.InvariantCulture));
httpRequestMessage.Headers.Add("x-ms-version", "2017-07-29");
// If you need any additional headers, add them here before creating
// the authorization header.
Yetkilendirme üst bilgisi oluşturan yöntemini çağırarak istek üst bilgilerine ekleyin. Makalenin devamlarında yetkilendirme üst bilgisi oluşturma hakkında bilgi bulabilirsiniz. Yöntem adı GetAuthorizationHeader'dır ve bu kod parçacığında bunu ekleyebilirsiniz:
// Get the authorization header and add it.
httpRequestMessage.Headers.Authorization = AzureStorageAuthenticationHelper.GetAuthorizationHeader(
storageAccountName, storageAccountKey, now, httpRequestMessage);
Bu noktada, httpRequestMessage yetkilendirme üst bilgileriyle eksiksiz REST isteğini içerir.
İsteği gönderme
İsteği artık sizin de 2009'da 1000 ABD'den daha büyük bir Depolama. Yanıt durumu kodunun değerinin 200 olduğunu, yani işlemi başarılı olduğunu kontrol edin. Ardından yanıtı ayrıştırarak. Bu durumda kapsayıcıların XML listesini alırsiniz. Şimdi isteği oluşturmak, isteği yürütmek ve ardından kapsayıcı listesi için yanıtı incelemek üzere GetRESTRequest yöntemini çağırma koduna bakalım.
// Send the request.
using (HttpResponseMessage httpResponseMessage =
await new HttpClient().SendAsync(httpRequestMessage, cancellationToken))
{
// If successful (status code = 200),
// parse the XML response for the container names.
if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
{
String xmlString = await httpResponseMessage.Content.ReadAsStringAsync();
XElement x = XElement.Parse(xmlString);
foreach (XElement container in x.Element("Containers").Elements("Container"))
{
Console.WriteLine("Container name = {0}", container.Element("Name").Value);
}
}
}
}
SendAsync çağrısı yaparken Fiddler gibi bir ağ algılayıcısı çalıştırdısanız, istek ve yanıt bilgilerini görebilir. Şimdi bir göz atarak. Depolama hesabının adı contosorest'tir.
Istek:
GET /?comp=list HTTP/1.1
İstek Üst Bilgileri:
x-ms-date: Thu, 16 Nov 2017 23:34:04 GMT
x-ms-version: 2014-02-14
Authorization: SharedKey contosorest:1dVlYJWWJAOSHTCPGiwdX1rOS8B4fenYP/VrU0LfzQk=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive
Yürütmeden sonra döndürülen durum kodu ve yanıt üst bilgileri:
HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 3e889876-001e-0039-6a3a-5f4396000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 00:23:42 GMT
Content-Length: 1511
Yanıt gövdesi (XML): Kapsayıcıları Listele işlemi için kapsayıcıların ve özelliklerinin listesi görüntülenir.
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
ServiceEndpoint="http://contosorest.blob.core.windows.net/">
<Containers>
<Container>
<Name>container-1</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:39:48 GMT</Last-Modified>
<Etag>"0x8D46CBD5A7C301D"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-2</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:40:50 GMT</Last-Modified>
<Etag>"0x8D46CBD7F49E9BD"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-3</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:10 GMT</Last-Modified>
<Etag>"0x8D46CBD8B243D68"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-4</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:25 GMT</Last-Modified>
<Etag>"0x8D46CBD93FED46F"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
<Container>
<Name>container-5</Name>
<Properties>
<Last-Modified>Thu, 16 Mar 2017 22:41:39 GMT</Last-Modified>
<Etag>"0x8D46CBD9C762815"</Etag>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Container>
</Containers>
<NextMarker />
</EnumerationResults>
İsteğin nasıl oluşturularak, hizmetin çağrılarak ve sonuçları ayrıştırmanın nasıl olduğunu anlıyoruz. Şimdi yetkilendirme üst bilgisi oluşturma hakkında bilginiz var. Bu üst bilgi oluşturmak karmaşık bir işlemdir ancak iyi haber, kod çalışmaya başladıktan sonra tüm Depolama Service REST API'leri için çalışır.
Yetkilendirme üst bilgisi oluşturma
İpucu
Azure Depolama artık bloblar Azure Active Directory kuyruklar için azure AD) tümleştirmeyi destekliyor. Azure AD, Azure Depolama'a bir isteği yetkilendirmek için çok daha Depolama. REST işlemlerini yetkilendirmek için Azure AD kullanma hakkında daha fazla bilgi için bkz.Azure Active Directory. Azure Depolama ile Azure AD tümleştirmesi hakkında genel bakış için bkz. Depolama kullanarak Azure Depolama erişimi Azure Active Directory.
Kavramsal olarak (kod yok) Azure'a yapılan istekleri yetkilendirmeyi açıklayan bir makaleDepolama.
Şimdi bu makaleyi tam olarak gerekli olacak şekilde yalıtabilir ve kodu gösterebilirsiniz.
İlk olarak Paylaşılan Anahtar yetkilendirmesi'ni kullanın. Yetkilendirme üst bilgisi biçimi şöyle görünür:
Authorization="SharedKey <storage account name>:<signature>"
İmza alanı, istekten Karma Tabanlı İleti Kimlik Doğrulama Kodu sha256 algoritması kullanılarak hesaplanan ve base64 kodlaması kullanılarak kodlanmış bir Karma Tabanlı İleti Kimlik Doğrulama Kodu (HMAC) alanıdır. Bunu mu demek? (Burada bekleyin, kurallı sözcüğü henüz duymamış bilesiniz.)
Bu kod parçacığı Paylaşılan Anahtar imza dizesinin biçimini gösterir:
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
Bu alanların çoğu nadiren kullanılır. Blob depolama için FIIL, md5, içerik uzunluğu, Kurallı Üst Bilgiler ve Kurallı Kaynak belirtin. Diğerlerini boş bırakabilirsiniz (ancak boş \n olduklarının farkında olmak için içine koyabilirsiniz).
CanonicalizedHeaders ve CanonicalizedResource nedir? İyi bir soru. Kurallı hale ne anlama geliyor? Microsoft Word sözcük olarak tanımaz bile. Wikipedia'nınkurallı hale getirileme hakkında şöyle bir açıklaması vardır: Bilgisayar bilimlerinde kurallı hale getirileme (bazen standartlaştırma veya normalleştirme), birden fazla olası temsili olan verileri "standart", "normal" veya kurallı biçime dönüştürme işlemidir. Normal konuşmada bu, öğe listesini (Canonicalized Headers örneğindeki üst bilgiler gibi) almak ve bunları gerekli bir biçime standart hale getirebilirsiniz. Temel olarak, Microsoft bir biçime karar verdi ve bunu eşleşmelisiniz.
Yetkilendirme üst bilgisi oluşturmak için gerekli olduğundan bu iki kurallı alanla başlayalım.
Kurallı üst bilgiler
Bu değeri oluşturmak için "x-ms-" ile başlanmış üst bilgileri alın ve sıralanın, ardından bunları bir dizede bir örnek dizesi olarak [key:value\n] biçimlendirin. Bu örnekte kurallı üst bilgiler şöyle görünür:
x-ms-date:Fri, 17 Nov 2017 00:44:48 GMT\nx-ms-version:2017-07-29\n
Bu çıkışı oluşturmak için kullanılan kod şu şekildedir:
private static string GetCanonicalizedHeaders(HttpRequestMessage httpRequestMessage)
{
var headers = from kvp in httpRequestMessage.Headers
where kvp.Key.StartsWith("x-ms-", StringComparison.OrdinalIgnoreCase)
orderby kvp.Key
select new { Key = kvp.Key.ToLowerInvariant(), kvp.Value };
StringBuilder headersBuilder = new StringBuilder();
// Create the string in the right format; this is what makes the headers "canonicalized" --
// it means put in a standard format. https://en.wikipedia.org/wiki/Canonicalization
foreach (var kvp in headers)
{
headersBuilder.Append(kvp.Key);
char separator = ':';
// Get the value for each header, strip out \r\n if found, then append it with the key.
foreach (string headerValue in kvp.Value)
{
string trimmedValue = headerValue.TrimStart().Replace("\r\n", string.Empty);
headersBuilder.Append(separator).Append(trimmedValue);
// Set this to a comma; this will only be used
// if there are multiple values for one of the headers.
separator = ',';
}
headersBuilder.Append("\n");
}
return headersBuilder.ToString();
}
Kurallı kaynak
İmza dizesinin bu bölümü, istek tarafından hedeflenen depolama hesabını temsil eder. İstek URI'sinde gerçek hesap <http://contosorest.blob.core.windows.net/?comp=list> adı (bu durumda) contosorest olduğunu unutmayın. Bu örnekte bu döndürülür:
/contosorest/\ncomp:list
Sorgu parametreleriniz varsa bu örnekte bu parametreler de yer almaktadır. Birden çok değer içeren ek sorgu parametrelerini ve sorgu parametrelerini de işen kod aşağıdaki şekildedir. Bu kodu tüm REST API'leri için çalışacak şekilde hazırlasanız unutmayın. ListContainers yönteminin hepsini içermesi gerektirse bile tüm olasılıkları dahil etmek istemeniz gerekir.
private static string GetCanonicalizedResource(Uri address, string storageAccountName)
{
// The absolute path will be "/" because for we're getting a list of containers.
StringBuilder sb = new StringBuilder("/").Append(storageAccountName).Append(address.AbsolutePath);
// Address.Query is the resource, such as "?comp=list".
// This ends up with a NameValueCollection with 1 entry having key=comp, value=list.
// It will have more entries if you have more query parameters.
NameValueCollection values = HttpUtility.ParseQueryString(address.Query);
foreach (var item in values.AllKeys.OrderBy(k => k))
{
sb.Append('\n').Append(item.ToLower()).Append(':').Append(values[item]);
}
return sb.ToString();
}
Kurallı hale getirildik dizeler ayarlanmıştır, şimdi yetkilendirme üst bilgisi oluşturmanın nasıl tamamlanmıştır? Bu makalede daha önce görüntülenen StringToSign biçiminde bir ileti imzası dizesi oluşturarak başlarsınız. Bu kavramı kodda açıklamalar kullanarak açıklamak daha kolaydır, bu nedenle Yetkilendirme Üst Bilgisi'ni döndüren son yöntem şöyledir:
internal static AuthenticationHeaderValue GetAuthorizationHeader(
string storageAccountName, string storageAccountKey, DateTime now,
HttpRequestMessage httpRequestMessage, string ifMatch = "", string md5 = "")
{
// This is the raw representation of the message signature.
HttpMethod method = httpRequestMessage.Method;
String MessageSignature = String.Format("{0}\n\n\n{1}\n{5}\n\n\n\n{2}\n\n\n\n{3}{4}",
method.ToString(),
(method == HttpMethod.Get || method == HttpMethod.Head) ? String.Empty
: httpRequestMessage.Content.Headers.ContentLength.ToString(),
ifMatch,
GetCanonicalizedHeaders(httpRequestMessage),
GetCanonicalizedResource(httpRequestMessage.RequestUri, storageAccountName),
md5);
// Now turn it into a byte array.
byte[] SignatureBytes = Encoding.UTF8.GetBytes(MessageSignature);
// Create the HMACSHA256 version of the storage key.
HMACSHA256 SHA256 = new HMACSHA256(Convert.FromBase64String(storageAccountKey));
// Compute the hash of the SignatureBytes and convert it to a base64 string.
string signature = Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes));
// This is the actual header that will be added to the list of request headers.
AuthenticationHeaderValue authHV = new AuthenticationHeaderValue("SharedKey",
storageAccountName + ":" + signature);
return authHV;
}
Bu kodu çalıştırarak elde edilen MessageSignature şu örnekteki gibi olur:
GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 01:07:37 GMT\nx-ms-version:2017-07-29\n/contosorest/\ncomp:list
AuthorizationHeader için son değer şu şekildedir:
SharedKey contosorest:Ms5sfwkA8nqTRw7Uury4MPHqM6Rj2nfgbYNvUKOa67w=
AuthorizationHeader, yanıtı göndermeden önce istek üst bilgisine yerleştirilen son üst bilgidir.
Bu, Depolama Services REST API'lerini çağırma isteği oluşturabilirsiniz sınıfını bir araya koymak için ihtiyacınız olan her şeyi kapsar.
Örnek: Blobları listele
Şimdi kapsayıcı kapsayıcısı-1 için List Blobs işlemi çağrılacak şekilde kodun nasıl değiştirildiksine bakalım. Bu kod, kapsayıcıları listelemek için kodla neredeyse aynıdır; tek fark URI ve yanıtı ayrıştırmaktır.
ListBlobsiçin başvuru belgelerine bakarsanız yöntemin GET, RequestURI ise şu şekilde olduğunu bulur:
https://myaccount.blob.core.windows.net/container-1?restype=container&comp=list
ListContainersAsyncREST'de URI'yi ListBlobs API'si olarak ayaran kodu değiştirebilirsiniz. Kapsayıcı adı container-1'tir.
String uri =
string.Format("http://{0}.blob.core.windows.net/container-1?restype=container&comp=list",
storageAccountName);
Ardından yanıtı işlenin, kodu kapsayıcılar yerine blob'ları değiştirecek şekilde değiştirebilirsiniz.
foreach (XElement container in x.Element("Blobs").Elements("Blob"))
{
Console.WriteLine("Blob name = {0}", container.Element("Name").Value);
}
Bu örneği çalıştırarak aşağıdakine benzer sonuçlar elde edersiniz:
Kurallı üst bilgiler:
x-ms-date:Fri, 17 Nov 2017 05:16:48 GMT\nx-ms-version:2017-07-29\n
Kurallı kaynak:
/contosorest/container-1\ncomp:list\nrestype:container
İleti imzası:
GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:Fri, 17 Nov 2017 05:16:48 GMT
\nx-ms-version:2017-07-29\n/contosorest/container-1\ncomp:list\nrestype:container
Yetkilendirme üst bilgisi:
SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Aşağıdaki değerler Fiddler'dandır:
Istek:
GET http://contosorest.blob.core.windows.net/container-1?restype=container&comp=list HTTP/1.1
İstek Üst Bilgileri:
x-ms-date: Fri, 17 Nov 2017 05:16:48 GMT
x-ms-version: 2017-07-29
Authorization: SharedKey contosorest:uzvWZN1WUIv2LYC6e3En10/7EIQJ5X9KtFQqrZkxi6s=
Host: contosorest.blob.core.windows.net
Connection: Keep-Alive
Yürütmeden sonra döndürülen durum kodu ve yanıt üst bilgileri:
HTTP/1.1 200 OK
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 7e9316da-001e-0037-4063-5faf9d000000
x-ms-version: 2017-07-29
Date: Fri, 17 Nov 2017 05:20:21 GMT
Content-Length: 1135
Yanıt gövdesi (XML): Bu XML yanıtı blobların ve özelliklerinin listesini gösterir.
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults
ServiceEndpoint="http://contosorest.blob.core.windows.net/" ContainerName="container-1">
<Blobs>
<Blob>
<Name>DogInCatTree.png</Name>
<Properties><Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
<Etag>0x8D52D5C4A4C96B0</Etag>
<Content-Length>419416</Content-Length>
<Content-Type>image/png</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5 />
<Cache-Control />
<Content-Disposition />
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
<ServerEncrypted>true</ServerEncrypted>
</Properties>
</Blob>
<Blob>
<Name>GuyEyeingOreos.png</Name>
<Properties>
<Last-Modified>Fri, 17 Nov 2017 01:41:14 GMT</Last-Modified>
<Etag>0x8D52D5C4A25A6F6</Etag>
<Content-Length>167464</Content-Length>
<Content-Type>image/png</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5 />
<Cache-Control />
<Content-Disposition />
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
<ServerEncrypted>true</ServerEncrypted>
</Properties>
</Blob>
</Blobs>
<NextMarker />
</EnumerationResults>
Özet
Bu makalede blob depolama alanına istekte REST API. İstekle kapsayıcıların listesini veya kapsayıcının blob listesini edinebilirsiniz. REST API çağrısı için yetkilendirme imzasını oluşturma ve REST isteğinde kullanma hakkında bilgi öğrendiniz. Son olarak yanıtı incelemeyi öğrendin.