Video – Cómo acceder al Storage de Windows Azure Utilizando REST en Windows 8 – WinRT – C#


 

Aprende a utilizar el servicio de cloud storage de Windows Azure utilizando la API REST.

Esto puede ser muy útil cuando no puedes usar Windows Azure SDK o cuando no hay una versión del SDK disponible para el lenguaje o plataforma que manejas.  

El video se hizo en WinRT + C# pero el mecanismo puede ser imitado desde otros lenguajes y frameworks.
En este video también se muestra como construir el header de autorización incluyendo como crear la firma con el Storage Key.

 

Aprende a utilizar el servicio de cloud storage de Windows Azure utilizando la API REST.

Esto puede ser muy útil cuando no puedes usar Windows Azure SDK o cuando no hay una versión del SDK disponible para el lenguaje o plataforma que manejas. 

El video se hizo en WinRT + C# pero el mecanismo puede ser imitado desde otros lenguajes y frameworks. 
En este video también se muestra como construir el header de autorización incluyendo como crear la firma con el Storage Key.

Acá el código fuente

using System;
using System.Globalization;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;

namespace App5.Storage
{
    public class BlockBlobStorage
    {
        private const string X_MS_BLOCK_BLOB = "BlockBlob";
        private const string X_MS_VERSION = "2012-02-12";
        public string Account { get; set; }
        public string Key { get; set; }

        public BlockBlobStorage(string account, string key)
        {
            Account = account;
            Key = key;
        }

        public async Task<HttpResponseMessage> UploadAsync(string blobname, Stream stream,
            string mimetype = "application/octect-stream")
        {
            var httpClient = new HttpClient();
            var content = new StreamContent(stream);
            var tmpdate = RFC1123DateTime;
            //headers
            content.Headers.ContentType = new MediaTypeHeaderValue(mimetype);
            httpClient.DefaultRequestHeaders.Add("x-ms-date", tmpdate);
            httpClient.DefaultRequestHeaders.Add("x-ms-blob-type", X_MS_BLOCK_BLOB);
            httpClient.DefaultRequestHeaders.Add("x-ms-version", X_MS_VERSION);

            string signature = CreateSignature(
                HTTPVerb: "PUT",
                ContentLength: stream.Length.ToString(),
                ContentType: mimetype,
                CanonicalizedHeaders: "x-ms-blob-type:BlockBlob\nx-ms-date:" + tmpdate + "\nx-ms-version:2012-02-12",
                CanonicalizedResource: string.Format("/{0}/{1}", Account, blobname)
                );

            httpClient.DefaultRequestHeaders.Add("Authorization",
                string.Format("SharedKey {0}:{1}", Account, signature));

            return await httpClient.PutAsync(
                string.Format("http://{0}.blob.core.windows.net/{1}", Account, blobname),
                content
                );
        }

        private string CreateSignature(
            string HTTPVerb = "",
            string ContentEncoding = "",
            string ContentLanguage = "",
            string ContentLength = "",
            string ContentMD5 = "",
            string ContentType = "",
            string Date = "",
            string IfModifiedSince = "",
            string IfMatch = "",
            string IfNoneMatch = "",
            string IfUnmodifiedSince = "",
            string Range = "",
            string CanonicalizedHeaders = "",
            string CanonicalizedResource = ""
            )
        {
            var sumstring = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n{8}\n{9}\n{10}\n{11}\n{12}\n{13}",
                HTTPVerb, ContentEncoding, ContentLanguage, ContentLength, ContentMD5,
                ContentType, Date, IfModifiedSince, IfMatch, IfNoneMatch, IfUnmodifiedSince,
                Range, CanonicalizedHeaders, CanonicalizedResource
                );

            return ComputeHMAC_SHA256(sumstring);
        }

        private string ComputeHMAC_SHA256(string input)
        {
            var alg = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA256");
            //preparar input
            var inputBuffer = CryptographicBuffer.ConvertStringToBinary(input, BinaryStringEncoding.Utf8);
            //preparar key
            var keybuffer = CryptographicBuffer.DecodeFromBase64String(Key);
            var hmacKey = alg.CreateKey(keybuffer);

            var signbuffer = CryptographicEngine.Sign(hmacKey, inputBuffer);
            return CryptographicBuffer.EncodeToBase64String(signbuffer);
        }

        public string RFC1123DateTime { get { return DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture); } }
    }
}
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/chocorramo.jpg"));
            var stream = await file.OpenStreamForReadAsync();

            var blobUploader = new BlockBlobStorage("jk4freeusage", "Yk4KMu8b0FAzCuqJf4y3j5XSslLxqXYndfkReWg8YkLFVaQOzF1Ga4eAE8jy+rEyOMh9RP228rz0SB2uwkoOoQ==");
            var rta = await blobUploader.UploadAsync("imagenes/chocorramo.jpg", stream, mimetype: "image/jpeg");

Este es el código completo que pueden descargar desde este GitHub

Saludos

Comments (3)

  1. Lo sé porque lo debo de saber, es mi propósito.   Hola Neo, te hace falta entender con que llave

  2. Lo sé porque lo debo de saber, es mi propósito.   Hola Neo, te hace falta entender con que llave

  3. Cada vez que vamos a enviar operaciones al storage de Windows Azure debemos llenar el header de autorización, esto en primera instancia parece una tarea fácil de realizar.

    De acuerdo a la documentación el header se debe elaborar de la siguiente forma