it-swarm.com.ru

Подпись общего доступа Azure - подпись не совпадает

Я получаю эту ошибку:

<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:6c3fc9a8-cdf6-4874-a141-10282b709022 Time:2014-07-30T10:48:43.8634735Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was rwl 2014-07-31T04:48:20Z /acoustie/$root 2014-02-14
</AuthenticationErrorDetail>
</Error>

Я получаю его, когда генерирую sas (подпись общего доступа), а затем вставляю этот sas в конце контейнера в URI в браузер. Это полный адрес сгенерированного sas:

https://acoustie.blob.core.windows.net/mark?sv=2014-02-14&sr=c&sig=E6w%2B3B8bAXK8Lhvvr62exec5blSxsA62aSWAg7rmX4g%3D&se=2014-07-30T13%3A30%3A14Z&sp=rwl

Я искал SO и Google и перепробовал множество комбинаций, насколько я могу судить, я все делаю правильно, я знаю, что нет, я просто не вижу этого ... действительно надеюсь, что кто-то может помочь :-\

Чтобы было ясно, я создаю sas для контейнера, а не для конкретного двоичного объекта и не для корневого контейнера. Доступ к BLOB-объекту определяется как Public Blob. Моя конечная цель - просто разрешить запись в контейнер с помощью sas, в то время как во время «отладки» я добавил большинство разрешений для SharedAccessBlobPolicy.

Я попытался добавить\в начало и конец имени контейнера. Без изменений.

Вот код, который я использую для генерации sas:

    var blobClient = storageAccount.CreateCloudBlobClient();
    //Get a reference to the blob container 
    var container = blobClient.GetContainerReference(containerName);

    // Do not set start time so the sas becomes valid immediately.
    var sasConstraints = new SharedAccessBlobPolicy 
    {
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30), 
        Permissions = SharedAccessBlobPermissions.Write 
        | SharedAccessBlobPermissions.Read
        | SharedAccessBlobPermissions.List,
    };

    var sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

    //Return the URI string for the container, including the SAS token.
        var sas = string.Format("{0}{1}", container.Uri.AbsoluteUri, sasContainerToken);
        Logger.Debug("SAS: {0}", sas);
        return sas;

Он генерирует подпись, но она не является действительной подписью.

Я пробовал разные контейнеры, изменяя политику доступа, с временем запуска и без него, продлевая срок действия до> 12 часов (я нахожусь в часовом поясе UTC + 10), кажется, не имеет значения, что я изменяю приводит к той же самой ошибке "подпись не соответствует".

Я даже пытался использовать более старую версию WindowsAzure.Storage, поэтому я попробовал 4.2 и 4.1. Даже попробовал URI в другом браузере, на самом деле не должно иметь значение, но эй ...

Любые предложения с благодарностью :-)

13
wallismark

Короткий ответ:

Добавьте comp=list&restype=container к вашему SAS URL, и вы не должны получить эту ошибку.

Длинный ответ:

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

29
Gaurav Mantri

В дополнение к @Gaurav Mantri Answer, чтобы дважды проверить разрешения, вы также можете создать свой OWN SAS токен на портале Azure.

 enter image description here

От этого вы можете связать этот comp=list&restype=container

Типы ресурсов, которые вы можете предоставить как:

  1. Контейнер
  2. Объект
  3. Обслуживание

Надеюсь, что это помогает кому-то ..

0
Jayendran