2012-05-04 18 views
5

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.

Respuesta

1

¿Es "my.azurestorage.windows.net" un error tipográfico? Esperaría algo allí como "https: // cuenta .blob.core.windows.net".

De lo contrario, el código se ve bastante similar al código en http://blog.smarx.com/posts/shared-access-signatures-are-easy-these-days, que funciona.

+0

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

+0

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

+0

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

3

¿Por qué esto?

writer.WriteLine(container.GetSharedAccessSignature(new SharedAccessPolicy(), "securedblobpolicy")); 

y no escribir la cadena sas ya ha creado?

Es tarde y fácilmente me podría estar perdiendo algo, pero parece que es posible que no esté guardando la misma firma de acceso que está utilizando para escribir el archivo en primer lugar.

Quizás tampoco sea relevante aquí, pero creo que hay un límite en la cantidad de políticas que puede tener en todo el contenedor. ¿Está cargando varios archivos en el mismo contenedor con este código y creando un nuevo contenedor sas cada vez?

En general, creo que sería mejor solicitar un sas para un blob individual en el momento que lo necesite con un corto tiempo de caducidad.

+0

container.GetSharedAccessSignature (nueva SharedAccessPolicy(), "securedblobpolicy")) devuelve la cadena sas del contenedor (o al menos eso es lo que supongo que está haciendo, podría estar equivocado). – crunchy

+0

Caray, eso fue doloroso. Aparentemente, no estaba recuperando la misma clave cuando utilicé el método GetSharedAccessSignature. Gracias por señalar eso Mark.Ahora solo tengo que lidiar con la sensación de ser un tonto :) – crunchy

+1

Me alegro de ser de ayuda, y no me siento mal, ¡todos lo hacemos! –

Cuestiones relacionadas