Хранилище 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 (очевидно, что ошибка происходит на сервере)

Я был бы очень признателен за решение или решение этой проблемы.