Ошибка аутентификации хранилища BLOB-объектов Azure при создании SAS для BLOB-объектов в подпапке - PullRequest
0 голосов
/ 07 июня 2019

Я использую следующий код, чтобы предоставить пользователям доступ к одному файлу в моем хранилище BLOB-объектов через подпись общего доступа (SAS):

            var container = _blobClient.GetContainerReference(containerPath[0]);
            var blob = container.GetBlockBlobReference(blobName);

            var policy = new SharedAccessBlobPolicy()
            {
                SharedAccessStartTime = DateTimeOffset.UtcNow,
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
                Permissions = SharedAccessBlobPermissions.Read
            };

            var blobHeaders = new SharedAccessBlobHeaders();
            var sasToken = blob.GetSharedAccessSignature(policy, blobHeaders);

            return blob.Uri.AbsoluteUri + sasToken;

Создаемый мной токен создан, но он не 't работает, я получаю следующую ошибку:

Подпись не совпадает.Используемая строка для подписи была r 2019-06-07T09: 19: 05Z 2019-06-08T09: 19: 05Z /blob/X/filestore/images/company/X.jpeg 2018-11-09 b

Где filestore/images/company/ - каталог, а X.jpeg - имя моего файла.Мой контейнер больших двоичных объектов является закрытым.

Я пробовал большинство вариантов, которые были предоставлены для вопросов по аналогичной теме, но не уверен, в чем я ошибаюсь.Я создал подпись общего доступа через портал Azure для этого BLOB-объекта, и он работал просто отлично.Есть идеи?

1 Ответ

0 голосов
/ 07 июня 2019

С тех пор, когда я попытался получить объект контейнера выше свойств, я обнаружил, что мой контейнер и файл не были найдены в хранилище Azure. Это было странно, так как путь к файлу был правильным. Во время просмотра я нашел этот ответ :

На самом деле существует только один слой контейнеров. Вы можете фактически создать «файловую систему», такую ​​как многоуровневое хранилище, но на самом деле все будет в 1 слое, в контейнере, в котором оно находится.

Для создания виртуальной «файловой системы», например хранилища, у вас может быть блоб имена, которые содержат «/», чтобы вы могли делать с как вы храните. Кроме того, хорошо, что вы можете искать BLOB-объекты на виртуальном уровне, давая частичную строку, до '/'.

Это означает, что в случае моего большого двоичного объекта (filestore/images/company/x.jpg) контейнер имеет значение filestore, а имя большого двоичного объекта - images/company/x.jpg, хотя на портале Azure отображаются подпапки, фактическая структура является плоской.

Как только я узнал об этом, я смог создать свою подпись общего доступа точно таким же образом, но на этот раз это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...