Подпись под общим названием 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
Типы ресурсов, которые вы можете предоставить как:
- Контейнер
- объект
- обслуживание
Надеюсь, это поможет кому-то.
Ответ 3
После того, как мы потратили на это много времени, фактическая ошибка отличается от исключительной ситуации, создаваемой компилятором .net если вы используете поля метаданных при загрузке BLOB файла в хранилище, проверьте символы метаданных. Например, я добавляю поля метаданных, такие как описание, имя файла и т.д. В поле описания у меня есть несколько ненужных символов, которые я нашел во время просмотра текста строки времени выполнения.
мое описание первоначально> описание файла test, после изменения описания "описание файла теста". Работает нормально.
значения метаданных, которые я извлек из разных источников, почему он получил эти ненужные символы. Удалите/измените значения метаданных, тогда они будут работать хорошо.