Подпись общего доступа 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 в конце контейнера в браузер. Это полный адрес сгенерированного 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.

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам