Я пытаюсь получить доступ к блобу, хранящемуся в закрытом контейнере в Windows Azure. Контейнер имеет подпись общего доступа, но когда я пытаюсь выполнить для доступа к блобу, я получаю сообщение StorgeClientException. Серверу не удалось аутентифицировать запрос. Убедитесь, что заголовок авторизации сформирован правильно, включая подпись ».Как использовать SharedAccessSignature для доступа к блокам
Код, который создал контейнер и загрузил блоб выглядит следующим образом:
// 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"));
}
Код я пытался использовать, чтобы прочитать блоб выглядит следующим образом:
// 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();
я могу сделайте вышеуказанную работу, добавив учетные данные, но это именно то, чего я пытаюсь избежать. Я не хочу, чтобы что-то было так же чувствительно, как и мои учетные данные, и я не знаю, как получить подпись в клиентском приложении, не имея учетных данных.
Любая помощь очень ценится.
my.azurestorage.windows.net есть, так как нет необходимости публиковать информацию об учетной записи. И код может выглядеть довольно похоже на код в блоге, на который вы ссылались, и он работает в определенной степени, но он не позволяет анонимному доступу к блобу с использованием общей подписки доступа. Это проблема! – crunchy
Но, конечно, ваше фактическое значение заканчивается на '.blob.core.windows.net', правильно? (И префикс - это имя вашей учетной записи хранилища?) – smarx
Значение в фактическом приложении - это адрес для контейнера. У меня сейчас нет моего кода, но то, что там, точно, я могу получить доступ к контейнерам и блокам, когда я предоставляю учетные данные учетной записи. Я все еще не уверен, почему указанная политика не вернула правильные значения, но теперь она работает. Спасибо за ввод. – crunchy