Как использовать SharedAccessSignature для доступа к BLOB-объектам
Я пытаюсь получить доступ к BLOB-объекту, хранящемуся в закрытом контейнере в Windows Azure. Контейнер имеет подпись общего доступа, но когда я пытаюсь чтобы получить доступ к BLOB-объекту, я получил StorgeClientException & quot; Серверу не удалось аутентифицировать запрос. Убедитесь, что заголовок авторизации сформирован правильно включая подпись & quot ;.
Код, который создал контейнер и загрузил BLOB-объект, выглядит следующим образом:
<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>
Код, который я пытался использовать для чтения BLOB-объектов, выглядит следующим образом:
<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>
Я могу заставить вышеуказанное работать, добавив учетные данные учетной записи, но это именно то, чего я пытаюсь избежать. Я не хочу что-то так же чувствительны, как и учетные данные моей учетной записи, и я понятия не имею, как получить подпись в клиентском приложении без учетных данных учетной записи.
Любая помощь очень ценится.