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