azure 文档数据库未授权异常:“在HTTP请求中找到的MAC签名与计算的签名不同,”

ivqmmu1c  于 2023-01-21  发布在  Mac
关注(0)|答案(4)|浏览(134)

偶尔我会在从DocumentDB请求文档时遇到UnauthorizedException。这个问题看起来类似于Azure DocumentDB - The MAC signature found in the HTTP request is not the same as the computed signature,所以我相信这个问题没有得到解决。

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/

**更新:**问题已修复,特别感谢Andrew Liu!

6mw9ycah

6mw9ycah1#

很高兴听到你不再遇到这个问题:)
为了其他人的利益在这里发帖...
如果您看到类似的问题,则表示应用程序和数据库之间存在验证标头不匹配。这可能是多种原因造成的...包括验证密钥不正确、系统时钟不同步或生成验证标头的方式存在问题。

第一方文档数据库SDK

如果您使用的是DocumentDB的第一方客户端SDK之一-很可能是验证密钥不正确或系统时钟问题...
如果这些看起来不错,那么DocumentDB端有一个bug。如果您遇到问题-请与我联系(askcosmsdb {at}microsoft.com),并提供一些活动ID+时间戳+堆栈跟踪,我可以帮助您查找问题。

剩余API

头是相当棘手的放在一起...以下是一些技巧构造auth头:

  • 所有参数(动词、资源类型、日期等)在签名前必须为小写,使用基于ID的路由时除外。
  • 对于基于id的路由,您需要签署资源的完整路径(例如dbs/MyDatabase/colls/MyCollection/docs/MyDocument);而不仅仅是资源的id(例如MyDocument)。请注意,路径区分大小写...而所有其他参数都应该是小写。
  • 密钥采用Base64编码。
  • 要签名的文本应该是utf-8编码。
  • 生成的身份验证令牌是SHA 256 HMAC,应该采用Base64编码。
  • 与所有HTTP头一样,签名(包括签名的令牌)应该是URL编码的(例如,+需要编码为%2B)。

完整文档和示例代码,请参见:https://msdn.microsoft.com/en-US/library/azure/dn783368.aspx

4ktjp1zp

4ktjp1zp2#

检查静态客户端方法。可能是您错误地使用了具有只读密钥的客户端。
尝试使用只读键写入会引发该异常。

ubof19bj

ubof19bj3#

我在使用主连接字符串时遇到了同样的问题,当我将连接字符串更改为辅助连接字符串时,它对我有效。

5hcedyr0

5hcedyr04#

我们可以通过以下变通方案解决该问题:
在Azure门户-〉Azure Cosmos DB for MongoDB -〉-〉连接字符串中,将有
1.读写密钥
1.只读密钥
如果阅读add时出错,请使用只读密钥中的主连接字符串。如果写入add时出错,请使用读写密钥中的主连接字符串。
根据应用程序正在执行的操作来使用它

相关问题