Хранилище больших двоичных объектов Azure — изменение разрешений контейнера и доступ с помощью SAS

#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 . В разделе запроса.