visual suscripcion studio referencia microsoft library example espaƱol documentacion docs descargar rest azure windows-runtime

rest - studio - msdn suscripcion



Trabajar con Azure en Winrt con Rest API, problema con la firma (1)

Estoy tratando de trabajar con almacenamiento azul en Winrt. Como el cliente de almacenamiento azure no es compatible con winrt, estoy tratando de usar la API de reposo de azure. Me está costando mucho conseguir la firma correcta y podría usar otro par de ojos para ayudarme a ver dónde me estoy equivocando.

Azure Account proporciona un nombre y una propiedad clave, este método crea la solicitud en este momento simplemente enumerando todos los blobs.

''vacío asíncrono privado BuildHTTPRequest (cuenta AzureAccount) {System.Net.Http.HttpClient request = new HttpClient ();

request.BaseAddress = new Uri(string.Format("http://{0}.blob.core.windows.net/", account.Name)); // Always have to use UTC date/time request.DefaultRequestHeaders.Add("x-ms-date", DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture)); string fmtStringToSign = "{0}/n{1}/n{2}/n{3:R}/n{4}{5}"; request.DefaultRequestHeaders.Add("x-ms-version", "2011-08-18"); string hdr = CanonicalizeHeaders(request.DefaultRequestHeaders); string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, ""); byte[] signatureByteForm = System.Text.Encoding.UTF8.GetBytes(authValue); string hashKey = account.Key; MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA256"); BinaryStringEncoding encoding = BinaryStringEncoding.Utf8; var messageBuffer = CryptographicBuffer.ConvertStringToBinary(authValue, encoding); IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(hashKey, encoding); CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer); IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer); string hashedString = CryptographicBuffer.EncodeToBase64String(signedMessage); String authHeader = String.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", "SharedKey", account.Name, hashedString); request.DefaultRequestHeaders.Add("Authorization", authHeader); // Send the request to the queue try { var test1 = request.GetAsync("?comp=list").Result; if (test1.IsSuccessStatusCode) { } } catch (WebException ex) { } }

Esto debería configurar los encabezados para la firma ...

public string CanonicalizeHeaders(System.Net.Http.Headers.HttpRequestHeaders hdrCollection) { StringBuilder retVal = new StringBuilder();// Look for header names that start with "x-ms-" // Then sort them in case-insensitive manner. List<string> httpStorageHeaderNameArray = new List<string>(); Dictionary<string, string> ht = new Dictionary<string, string>(); foreach (var key in hdrCollection) { if (key.Key.ToLowerInvariant().StartsWith("x-ms-", StringComparison.Ordinal)) { if (ht.ContainsKey(key.Key.ToLowerInvariant())) { ht[key.Key.ToLowerInvariant()] = string.Format("{0},{1}", ht[key.Key.ToLowerInvariant()], hdrCollection.FirstOrDefault(m => m.Key == key.Key).ToString().Replace("/n", string.Empty).Replace("/r", string.Empty).Trim()); } else { httpStorageHeaderNameArray.Add(key.Key.ToLowerInvariant()); ht.Add(key.Key.ToLowerInvariant(), hdrCollection.FirstOrDefault(m => m.Key == key.Key).Value.FirstOrDefault().ToString().Replace("/n", string.Empty).Replace("/r", string.Empty).Trim()); } } } httpStorageHeaderNameArray.Sort();// Now go through each header''s values in the sorted order and append them to the canonicalized string. foreach (string key in httpStorageHeaderNameArray) { retVal.AppendFormat("{0}:{1}/n", key.Trim(), ht[key]); } return retVal.ToString(); }

''


La última versión de la biblioteca del cliente de almacenamiento es compatible con WinRT. Puedes leer más sobre esto aquí: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/introducing-windows-azure-storage-client-library-2-0-for-net- and-windows-runtime.aspx . Lo que hice fue descargar el código fuente de Github: https://github.com/WindowsAzure/azure-sdk-for-net , abrí la solución en VS 2012 y construí el proyecto RT para obtener los archivos winmd necesarios.

En cuanto a su problema, creo que se encuentra con este problema porque está pasando una cadena vacía por una cadena de recursos canonicalizada:

string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, "")

Consulte este enlace para obtener más detalles sobre cómo crear una cadena de recursos canonicalizados: http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx .