#c# #azure #azure-storage
#c# #azure #azure-хранилище
Вопрос:
У меня есть Azure Blob
контейнер, который содержит несколько больших двоичных объектов. Контейнер был создан (успешно) с помощью кода:
if (container.CreateIfNotExists())
{
var permissions = container.GetPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Off;
container.SetPermissions(permissions);
}
Вы увидите, что для разрешений установлено значение private (т. Е. PublicAccess
is Off
).
В более поздней части моего кода я хотел бы открыть разрешения, используя SAS
, с истечением срока действия 1 hour
. Чтобы попытаться это сделать, я использую код:
if (container.Exists())
{
//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 = DateTime.UtcNow.AddHours(1);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List;
//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 container.Uri sasContainerToken;
}
Однако, независимо от того, как я его формирую, когда я перехожу в своем браузере к возвращаемому URL (т.Е. container.Uri sasContainerToken
), Я получаю ошибку аутентификации:
<Error>
<Code>AuthenticationFailed</Code>
<Message>
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:d7f89ef3-919b-4b86-9b4f-4a95273c20ff Time:2014-06-26T15:33:11.2754096Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was rl 2014-06-26T16:32:02Z /mycontainer/$root 2014-02-14
</AuthenticationErrorDetail>
</Error>
Может ли кто-нибудь дать мне какие-либо указания относительно того, почему я вижу эту ошибку аутентификации?
Мой окончательный URL-адрес выглядит так, как будто он находится в правильном формате?:
https://myservice.blob.core.windows.net/mycontainer?sv=2014-02-14amp;sr=camp;sig=0MSvKIRJnxWr2G+h0mj+slbNtZM3VnjSF8KPhBKCPs8=amp;se=2014-06-26T16:32:02Zamp;sp=rl
Я в растерянности, поэтому буду признателен за любые указания.
Ответ №1:
Я также столкнулся с точно такой же ошибкой :). Вы не можете выполнять операции, связанные с контейнером (за исключением перечисления больших двоичных объектов), используя подпись общего доступа. Для выполнения операций с контейнером вам потребуется использовать ключ учетной записи. С этой страницы: http://msdn.microsoft.com/en-us/library/azure/jj721951.aspx
Поддерживаемые операции с использованием подписей общего доступа включают:
- Чтение и запись содержимого страницы или блочного большого двоичного объекта, списков блоков, свойств и метаданных
- Удаление, аренда и создание моментального снимка большого двоичного объекта
- Список больших двоичных объектов в контейнере
Обновить
Для перечисления больших двоичных объектов просто добавьте amp;comp=listamp;restype=container
их в свой URL, и это должно сработать. Итак, ваш URL-адрес должен быть:
https://myservice.blob.core.windows.net/mycontainer?sv=2014-02-14amp;sr=camp;sig=0MSvKIRJnxWr2G+h0mj+slbNtZM3VnjSF8KPhBKCPs8=amp;se=2014-06-26T16:32:02Zamp;sp=rlamp;comp=listamp;restype=container
Комментарии:
1. На самом деле я хотел бы перечислить только URL-адреса больших двоичных объектов. Похоже, это должно быть возможно. Разве невозможно перечислить их таким образом, перейдя через браузер?
2. Вау … идеально! Спасибо! Я не сталкивался с этими параметрами строки запроса в документе. Должно быть, я их где-то пропустил. Спасибо! Ответ принят!
3. Это здесь … msdn.microsoft.com/en-us/library/azure/dd135734.aspx . В разделе запроса.