Como usar SharedAccessSignature para acessar blobs
Eu estou tentando acessar um blob armazenado em um contêiner particular no Windows Azure. O contêiner tem uma Assinatura de acesso compartilhado, mas quando tento acessar o blob, recebo uma StorgeClientException "O servidor não autenticou a solicitação. Verifique se o cabeçalho de autorização está formado corretamente, incluindo a assinatura".
O código que criou o container e carregou o blob é assim:
<code>// 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")); } </code>
O código que tenho tentado usar para ler o blob é assim:
<code>// 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(); </code>
Eu posso fazer o trabalho acima, adicionando as credenciais da conta, mas isso é exatamente o que eu estou tentando evitar. Eu não quero algo tão sensível como as credenciais da minha conta, e não tenho ideia de como obter a assinatura no aplicativo cliente sem as credenciais da conta.
Qualquer ajuda é muito apreciada.