Estoy intentando acceder a un blob almacenado en un contenedor privado en Windows Azure. El contenedor tiene una Firma de Acceso Compartido pero cuando intento para acceder al blob obtengo una StorgeClientException "El servidor no pudo autenticar la solicitud. Asegúrese de que el encabezado de Autorización esté formado correctamente incluyendo la firma".Cómo usar SharedAccessSignature para acceder a blobs
El código que crea el contenedor y subido la burbuja se ve así:
// create the container, set a Shared Access Signature, and share it
// first this to do is to create the connnection to the storage account
// this should be in app.config but as this isa test it will just be implemented
// here:
// add a reference to Microsoft.WindowsAzure.StorageClient
// and Microsoft.WindowsAzure.StorageClient set up the objects
//storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["ConnectionString"]);
blobClient = storageAccount.CreateCloudBlobClient();
// get a reference tot he container for the shared access signature
container = blobClient.GetContainerReference("blobcontainer");
container.CreateIfNotExist();
// now create the permissions policy to use and a public access setting
var permissions = container.GetPermissions();
permissions.SharedAccessPolicies.Remove("accesspolicy");
permissions.SharedAccessPolicies.Add("accesspolicy", new SharedAccessPolicy
{
// this policy is live immediately
// if the policy should be delatyed then use:
//SharedAccessStartTime = DateTime.Now.Add(T); where T is some timespan
SharedAccessExpiryTime =
DateTime.UtcNow.AddYears(2),
Permissions =
SharedAccessPermissions.Read | SharedAccessPermissions.Write
});
// turn off public access
permissions.PublicAccess = BlobContainerPublicAccessType.Off;
// set the permission on the ocntianer
container.SetPermissions(permissions);
var sas = container.GetSharedAccessSignature(new SharedAccessPolicy(), "accesspolicy");
StorageCredentialsSharedAccessSignature credentials = new StorageCredentialsSharedAccessSignature(sas);
CloudBlobClient client = new CloudBlobClient(storageAccount.BlobEndpoint,
new StorageCredentialsSharedAccessSignature(sas));
CloudBlob sasblob = client.GetBlobReference("blobcontainer/someblob.txt");
sasblob.UploadText("I want to read this text via a rest call");
// write the SAS to file so I can use it later in other apps
using (var writer = new StreamWriter(@"C:\policy.txt"))
{
writer.WriteLine(container.GetSharedAccessSignature(new SharedAccessPolicy(), "securedblobpolicy"));
}
El código que he estado tratando de utilizar para leer la mancha se ve así:
// the storace credentials shared access signature is copied directly from the text file "c:\policy.txt"
CloudBlobClient client = new CloudBlobClient("https://my.azurestorage.windows.net/", new StorageCredentialsSharedAccessSignature("?sr=c&si=accesspolicy&sig=0PMoXpht2TF1Jr0uYPfUQnLaPMiXrqegmjYzeg69%2FCI%3D"));
CloudBlob blob = client.GetBlobReference("blobcontainer/someblob.txt");
Console.WriteLine(blob.DownloadText());
Console.ReadLine();
que pueda haga que todo lo anterior agregue las credenciales de la cuenta, pero eso es exactamente lo que intento evitar. No quiero que algo sea tan delicado como las credenciales de mi cuenta simplemente sentado y no tengo idea de cómo obtener la firma en la aplicación del cliente sin tener las credenciales de la cuenta.
Cualquier ayuda es muy apreciada.
my.azurestorage.windows.net está allí ya que no hay necesidad de hacer pública la información de la cuenta. Y el código puede parecer bastante similar al código en el blog al que se refirió, y funciona hasta cierto punto, pero no permite el acceso anónimo a un blob con el uso de la firma de acceso compartido. ¡Ese es el problema! – crunchy
Pero, para estar seguro, su valor real allí termina en '.blob.core.windows.net', ¿verdad? (¿Y el prefijo es el nombre de su cuenta de almacenamiento?) – smarx
el valor en la aplicación real es la dirección del contenedor. No tengo mi código abierto en este momento, pero lo que hay allí es preciso, ya que puedo acceder a los contenedores y blobs cuando proporciono las credenciales de la cuenta. Todavía no estoy seguro de por qué la política mencionada no devolvió los valores correctos, pero está funcionando ahora. Gracias por el aporte. – crunchy