DocumentDB UnauthorizedException: подпись MAC, найденная в HTTP-запросе, не совпадает с вычисленной подписью.

Время от времени у меня возникало исключение UnauthorizedException при запросе документов из DocumentDB. Проблема выглядит аналогично Azure DocumentDB — подпись MAC, найденная в HTTP-запросе, не совпадает с вычисленной подписью, поэтому я считаю, что проблема не решена.

Microsoft.Azure.Documents.UnauthorizedException : 
Message: "The MAC signature found in the HTTP request is not the same as the computed signature. 
Request URI: rntbd://db5prdddc01-docdb-1.documents.azure.com:14245/apps/35e0fabb-e03e-48d4-90ad-7b91b63c0153/services/9bb95f7b-9ad6-4128-a66a-de68279d5124/partitions/44a24d42-a85c-42cc-98c4-fc8a733245ac/replicas/130953283548138839p/

ОБНОВЛЕНИЕ: проблема устранена. Особая благодарность Эндрю Лю!


person Vlad Bilyk    schedule 25.12.2015    source источник
comment
Я начал получать это, когда переключился со ссылок _self на ссылку на основе идентификатора, поэтому теперь я пассивно кэширую ссылки _self после первого получения по ссылкам на основе идентификатора. Я все еще иногда получаю ошибку, но реже, и я встроил автоматический повтор, чтобы скрыть ее от кода моего приложения. Еще одна вещь, которую я изменил в своей системе, когда начал замечать проблему, заключалась в том, что моя тестовая система теперь создает новую базу данных и коллекцию каждый раз при запуске теста и удаляет ее в конце. Интересно, способствует ли быстрое и частое создание/удаление этой проблеме.   -  person Larry Maccherone    schedule 25.12.2015
comment
Это то, что DocumentDB нужно исправить. Я отправил им подробную информацию о том, когда я получил это, так что, возможно, они работают над этим. После праздника кто-то из команды может связаться с вами, чтобы узнать ваши данные. Это может помочь им сосредоточиться на этом.   -  person Larry Maccherone    schedule 25.12.2015
comment
Я также столкнулся с проблемой после перехода на ссылки на основе идентификаторов.   -  person Vlad Bilyk    schedule 26.12.2015
comment
Привет! Я работаю в команде DocumentDB... Не могли бы вы написать мне по электронной почте с более подробной информацией: andrl {at} microsoft.com   -  person Andrew Liu    schedule 06.01.2016
comment
Несколько вещей, которые помогут: 1) Какую платформу + версию SDK вы используете? 2) Это происходит периодически или постоянно? 3) Можете ли вы указать действие и отметку времени для исключения? Это позволит нам искать и отслеживать конкретный запрос в наших журналах. 4) Можете ли вы включить фрагмент кода того, что вы пытаетесь сделать?   -  person Andrew Liu    schedule 06.01.2016
comment
@AndrewLiu, я отправил запрошенную информацию по электронной почте.   -  person Vlad Bilyk    schedule 08.01.2016
comment
@AndrewLiu, у тебя есть обновления?   -  person Vlad Bilyk    schedule 20.01.2016


Ответы (3)


Рад слышать, что вы больше не сталкиваетесь с этой проблемой :)

Пишу сюда для всеобщего блага...

Если вы видите подобную проблему, это означает, что существует несоответствие заголовка аутентификации между приложением и базой данных. Это может быть результатом многих вещей... включая неправильный ключ аутентификации, рассинхронизацию системных часов или проблему с генерацией заголовка аутентификации.

Собственные SDK DocumentDB

Если вы используете один из сторонних клиентских SDK DocumentDB, скорее всего, это неправильный ключ аутентификации или проблема с системными часами...

Если они выглядят хорошо, то на стороне DocumentDB есть ошибка. Если у вас возникли проблемы, свяжитесь со мной (попросите cosmosdb {at} microsoft.com), предоставив несколько идентификаторов действий + метки времени + трассировку стека, и я помогу вам разобраться в проблеме.

Отдых API

Заголовок довольно сложно собрать... Вот несколько советов по созданию заголовка авторизации:

  • Все параметры (глаголы, тип ресурса, дата и т. д.) должны быть написаны в нижнем регистре до подписания, ЗА ИСКЛЮЧЕНИЕМ при использовании маршрутизации на основе идентификатора.

  • Для маршрутизации на основе идентификатора вам потребуется подписать полный путь к ресурсу (например, dbs/MyDatabase/colls/MyCollection/docs/MyDocument); не только идентификатор ресурса (например, MyDocument). Обратите внимание, что путь чувствителен к регистру... в то время как все остальные параметры должны быть строчными.

  • Ключ закодирован в Base64.

  • Подписываемый текст должен быть в кодировке utf-8.

  • Сгенерированный токен аутентификации представляет собой SHA256 HMAC и должен быть закодирован в Base64.

  • Как и все заголовки HTTP, подпись (включая подписанный токен) должна быть закодирована в URL (например, + необходимо закодировать как %2B).

Полную документацию и пример кода см. по адресу: https://msdn.microsoft.com/en-US/library/azure/dn783368.aspx

person Andrew Liu    schedule 05.02.2016
comment
Я вижу эту проблему. Вы можете помочь @Andrew Liu? - person user911; 20.09.2019

Проверьте метод статического клиента. Возможно, вы по ошибке используете клиент с ключом только для чтения.

Попытка записи с использованием ключа только для чтения вызывает это исключение.

person Murilo Maciel Curti    schedule 13.12.2019

Я столкнулся с той же проблемой, когда использовал основную строку подключения, когда я изменил строку подключения на вторичную, это сработало для меня.

введите здесь описание изображения

person Jeberdson Abraham    schedule 19.03.2021