Хранилище Azure: сервер 403 не смог аутентифицировать запрос
Я ищу здесь и в Google, но я не могу найти решение.
С моим кодом С# я хочу прочитать файл из Azure Storage Blob.
Код (всего 6 строк) отлично работает в другом проекте (Windows 8.1 Universal App), но не в моем новом приложении Windows 10 UWP.
Это мой код:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container-name");
CloudBlob b1 = container.GetBlobReference("27.76914.json");
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("stefano1.json", CreationCollisionOption.ReplaceExisting);
await b1.DownloadToFileAsync(file);
Исключение:
Серверу не удалось аутентифицировать запрос. Убедитесь, что значение Заголовок авторизации формируется правильно, включая подпись.
Использование Fiddler4 Я нашел эту ошибку в сообщении 403:
Подпись MAC, найденная в HTTP-запросе "R2t9hKsyXf470HF2LNP8T + M2nci0ddE/ojQ0r4UVjJQ =", не совпадает с любой вычисленной сигнатурой
Мои попытки:
- Приложение работает в первый раз (файл загружен). Во второй раз я получаю исключение.
- Если я изменил запрошенное имя файла: приложение работает в первый раз (файл загружен). Во второй раз я получаю исключение.
- На следующий день я получаю сразу же исключение (при первом запуске)
- Также, если я удаляю папки bin и obj, я получаю сообщение об ошибке
- Если я создаю другое приложение и пытаюсь загрузить тот же файл (тот же, что и в пункте 1), он работает в первый раз, но не второй.
- В консольном приложении все работает хорошо.
Это запрос Fiddler4 Raw (где ***** - мое имя учетной записи Azure Storage):
GET https://*****.blob.core.windows.net/container-name/27.76914.json HTTP/1.1
x-ms-client-request-id: accee7e7-646d-417a-b734-1591cbc16a8d
x-ms-date: Thu, 03 Sep 2015 06:31:37 GMT
x-ms-version: 2015-02-21
User-Agent: WA-Storage/5.0.2 (Windows Runtime)
Authorization: SharedKey *****:R2t9hKsyXf470HF2LNP8T+M2nci0ddE/ojQ0r4UVjJQ=
Host: *****.blob.core.windows.net
If-Modified-Since: Sun, 30 Aug 2015 18:52:41 GMT
If-None-Match: "0x8D2B16C2ED82C4A"
Connection: Keep-Alive
Спасибо!
Ответы
Ответ 1
Об этом также сообщалось на нашей странице GitHub: https://github.com/Azure/azure-storage-net/issues/171
Наша ведущая теория заключается в том, что прокси-сервер кэширования может находиться между клиентом и сервером, влияющим на ваши запросы.
Мы все еще расследуем и сообщим вам.
Ответ 2
У меня была аналогичная проблема (на Java), пытающаяся получить доступ к блокам с локальной машины.
Попытка загрузить blob будет работать один из двух раз, пытаясь заставить InputStream никогда не работать. В обоих случаях ошибка была такой же, как у вас.
Мой код всегда работал с виртуальной машиной в облаке.
Проблема была исправлена, когда я изменил протокол по умолчанию от HTTP до HTTPS.
При создании CloudStorageAccount существует конструктор, который позволяет вам указывать протокол по умолчанию. Он также доступен для С# (здесь)
Также для записи AZCopy завершится с ошибкой для источника с HTTP с аналогичной ошибкой.
Вы можете попробовать.
Ответ 3
Проверьте часовой пояс вашего компьютера или мобильного телефона.
Ответ 4
@Питер Марино,
Эта проблема уже решена? Сейчас я получаю эту ошибку очень часто, но периодически. Я имею в виду, что некоторые операции выполняются успешно, а некоторые - нет.
Удаленный сервер возвратил ошибку: (403) Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.
Та же самая ошибка появляется даже тогда, когда я использовал загрузки на основе SAS (очевидно, что ошибка происходит на сервере)
Я был бы очень признателен за решение или решение этой проблемы.