Контейнер BLOB-объектов Azure, не может сгенерировать токен - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над хранилищем Azure, но не могу создать правильный токен SAS для передачи на мой веб-интерфейс JavaScript.Следуя нескольким учебникам и примерам, я не могу получить рабочий токен для JS.

Я проверяю свой токен в учебнике, чтобы мой собственный javascript не мешал мне: https://dmrelease.blob.core.windows.net/azurestoragejssample/samples/sample-blob.html

Я часами пробовал разные решения, но мой сгенерированный токен выглядит так же, как сгенерированный Azure.Чего мне не хватает?

код

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);

//Set the expiry time and permissions for the container.
//In this case no start time is specified, so the shared access signature becomes valid immediately.
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(24);
sasConstraints.Permissions = SharedAccessBlobPermissions.List | SharedAccessBlobPermissions.Write;

//Generate the shared access signature on the container, setting the constraints directly on the signature.
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

//Return the URI string for the container, including the SAS token.
return sasContainerToken;

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Исходя из моего теста, код подходит для генерации токена SAS.Если вы хотите перечислить большие двоичные объекты в контейнере, вам нужно добавить &comp=list&restype=container к вашему URL SAS.Тогда это должно сработать.

Get https://xxxxx.blob.core.windows.net/test?sv=2018-03-28&sr=c&sig=xxxxxxxxx&sp=rwl&comp=list&restype=container

Служба хранилища Azure не может определить, является ли ресурс, к которому вы пытаетесь получить доступ, BLOB-объектом или контейнером, и предполагает, что это большой объект.Поскольку предполагается, что типом ресурса является blob, для вычисления SAS используется контейнер $ root blob (который вы можете увидеть из сообщения об ошибке).Так как SAS был рассчитан для контейнера меток, вы получаете ошибку Signature Not Match.Указывая restype = container, вы указываете службе хранения обрабатывать ресурс как контейнер.comp = список необходим согласно спецификации REST API.

Для получения дополнительной информации, пожалуйста, обратитесь к другой SO теме .

0 голосов
/ 27 ноября 2018

Вместо этого создайте токен для учетной записи хранения.Разрешения в указанном учебном пособии предоставляются политикой учетной записи хранения.

public static string GenerateAccountSASToken(string connectionString)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    SharedAccessAccountPolicy accountpolicy = new SharedAccessAccountPolicy();
    accountpolicy.SharedAccessStartTime = DateTimeOffset.UtcNow.AddHours(-24);
    accountpolicy.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(24);
    accountpolicy.Permissions = SharedAccessAccountPermissions.Add | SharedAccessAccountPermissions.Create | SharedAccessAccountPermissions.List | SharedAccessAccountPermissions.ProcessMessages | SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Update | SharedAccessAccountPermissions.Write;
    accountpolicy.Services = SharedAccessAccountServices.Blob;
    accountpolicy.ResourceTypes = SharedAccessAccountResourceTypes.Container | SharedAccessAccountResourceTypes.Object | SharedAccessAccountResourceTypes.Service;
    return  storageAccount.GetSharedAccessSignature(accountpolicy);
}
0 голосов
/ 27 ноября 2018

Что касается проблемы, пытались ли вы использовать JS для создания токена SAS.

var azure = require('azure-storage');
var fs = require('fs');
var SasConstants = azure.Constants.AccountSasConstants;

var blobService = azure.createBlobService();

var containerName = 'containername';
var blobName = 'blobname';

var startDate = new Date('');
var expiryDate = new Date(startDate);
expiryDate.setDate(startDate.getDate() + 1);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.BlobUtilities.SharedAccessPermissions.READ + azure.BlobUtilities.SharedAccessPermissions.ADD + azure.BlobUtilities.SharedAccessPermissions.CREATE+ azure.BlobUtilities.SharedAccessPermissions.WRITE,
    Start: startDate,
    Expiry: expiryDate
  },
};

var token = blobService.generateSharedAccessSignature(containerName, null, sharedAccessPolicy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...