Подпись под общим названием 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 (Signal Access Signature), затем вставляю этот 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, а не в корневом контейнере. Доступ к blob определяется как Public Blob. Моя конечная цель - просто разрешить запись в контейнер с помощью sas, а "отладка" я добавил большинство разрешений для SharedAccessBlobPolicy.

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

Это код, который я использую для генерации 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. Даже попробовал ури в другом браузере, на самом деле не стоит ничего менять, но эй...

Любые предложения приветствуются :-)

Ответ 1

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

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

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

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

Ответ 2

Добавление в @Gaurav Mantri Ответ, чтобы дважды проверить разрешения, вы также можете создать свой СОБСТВЕННЫЙ токен SAS на Azure Portal

enter image description here

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

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

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

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

Ответ 3

После того, как мы потратили на это много времени, фактическая ошибка отличается от исключительной ситуации, создаваемой компилятором .net если вы используете поля метаданных при загрузке BLOB файла в хранилище, проверьте символы метаданных. Например, я добавляю поля метаданных, такие как описание, имя файла и т.д. В поле описания у меня есть несколько ненужных символов, которые я нашел во время просмотра текста строки времени выполнения.

мое описание первоначально> описание файла test, после изменения описания "описание файла теста". Работает нормально.

значения метаданных, которые я извлек из разных источников, почему он получил эти ненужные символы. Удалите/измените значения метаданных, тогда они будут работать хорошо.