Descargar archivos grandes desde Azure Storage con Firmas de acceso compartido (SAS)

El almacenamiento de datos en cloud debe conllevar una política de acceso y control adecuada al tipo de información. Dentro de Azure podemos utilizar direcciones de enlace temporales para operaciones con ficheros en diversos escenarios. En nuestro caso utilizaremos SAS (Shared Acces Signature) para la descarga directa de archivos de gran volumen, de esta forma además de un mayor control tambien descargaremos de operaciones de entrada/salida a nuestro servidor, permitiendo mayor rapidez de acceso.

La dirección que se genera es del tipo:

https://miespacio.blob.core.windows.net/MiContenedor/MiFichero.zip?sv=2016-05-31&sr=b&sig=Kasdf8mqcgh4NMjQcRaZMTA1bSpXJrajsy404ZkDipE%3D&se=2018-08-27T12%3A10%3A33Z&sp=r

Donde distinguimos a continuación de la dirección URI del recurso un Token formado por:

  • sv: versión de API para ejecutar
  • sr: especificamos B para un blob y C para container
  • se: fecha limite a partir de la cual el enlace expira
  • sp: permisos asociados, en este caso R solo de lectura

Para ver más parámetros adicionales y otras opciones tienes disponible la documentación completa aquí.

CloudStorageAccount cuentaAlmacen = new CloudStorageAccount(new StorageCredentials("miespacio", "clave"), true);
var blobClient = cuentaAlmacen.CreateCloudBlobClient();
		
var container = blobClient.GetContainerReference("MiContenedor");
var blob = container.GetBlockBlobReference("MiFichero.zip");
		
var token = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
    {
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(60),
    }, new SharedAccessBlobHeaders()
    {
ContentDisposition = "attachment; filename="+nombreFichero
    });

var url = string.Format("{0}{1}", blob.Uri, token);
Response.Redirect(url, true);

NOTA: la versión 11 del SDK de Azure está discontinuada, versión adaptada a la v12 aquí.