DocumentDB UnauthorizedException:"The MAC signature found in the HTTP request is not the same as the computed signature."

DocumentDB UnauthorizedException: "The MAC signature found in the HTTP request is not the same as the computed signature."

从 DocumentDB 请求文档时,我偶尔会遇到 UnauthorizedException。这个问题看起来类似于,所以我认为问题没有解决。

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!

很高兴听到您不再遇到此问题:)

在这里发帖是为了其他人的利益...

如果您看到这样的问题,则表示应用程序和数据库之间的身份验证 header 不匹配。这可能是多种原因造成的...包括不正确的身份验证密钥、系统时钟不同步或身份验证 header 的生成方式存在问题。

First-Party DocumentDB SDK

如果您使用的是 DocumentDB 的第一方客户端 SDK 之一 - 很可能是授权密钥不正确或系统时钟问题...

如果这些看起来不错,那就是 DocumentDB 端存在错误。如果您遇到问题 - 请联系我 (askcosmosdb {at} microsoft.com) 并提供一些 activity ID + 时间戳 + 堆栈跟踪,我可以帮助您调查问题。

休息API

header 组合起来相当棘手...这里有一些构建身份验证的技巧 header:

  • 所有参数(动词、资源类型、日期等)在签名前必须小写,使用 id-based 路由时除外。

  • 对于id-based路由,您需要签署资源的完整路径(例如dbs/MyDatabase/colls/MyCollection/docs/MyDocument);不仅仅是资源的 ID(例如 MyDocument)。请注意,路径是 case-sensitive... 而所有其他参数都应小写。

  • 密钥是Base64编码的。

  • 待签名的文本应为utf-8编码。

  • 生成的身份验证令牌是 SHA256 HMAC,应进行 Base64 编码。

  • 与所有 HTTP header 一样,签名(包括签名令牌)应进行 URL 编码(例如 + 需要编码为 %2B).

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

检查静态客户端方法。有可能是您错误地使用了带有只读密钥的客户端。

尝试使用只读密钥写入会引发该异常。

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