【问题标题】:DocumentDB UnauthorizedException: "The MAC signature found in the HTTP request is not the same as the computed signature."DocumentDB UnauthorizedException:“在 HTTP 请求中找到的 MAC 签名与计算的签名不同。”
【发布时间】:2015-12-25 10:22:36
【问题描述】:

从 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!

【问题讨论】:

  • 当我从 _self 链接切换到基于 id 的链接时,我开始得到它,所以我现在在第一次使用基于 id 的链接获取后被动缓存 _self 链接。有时我仍然会收到错误,但会更少,并且我已经内置了自动重试以将其隐藏在我的应用程序代码中。当我开始看到问题时,我对系统所做的另一件事是,我的测试系统现在每次测试开始时都会创建一个新的数据库和集合,并在最后删除它。我想知道快速且经常创建/删除是否会导致问题。
  • 这是 DocumentDB 需要解决的问题。我已经向他们发送了我什么时候收到的详细信息,所以也许他们正在努力。假期结束后,团队中的某个人可能会与您联系以获取您的详细信息。这可能会帮助他们归零。
  • 我在切换到基于 id 的链接后也遇到了这个问题。
  • 你好 - 我在 DocumentDB 团队工作...你能给我发电子邮件详细信息吗:andrl {at} microsoft.com
  • 一些有帮助的事情:1)您使用的是什么平台+版本的SDK? 2)这种情况是间歇性发生还是总是发生? 3) 你能包括异常的活动和时间戳吗?这将允许我们在日志中查找和跟踪特定请求。 4) 你能包含你想要做什么的代码 sn-p 吗?

标签: azure azure-cosmosdb azure-sdk-.net


【解决方案1】:

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

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

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

第一方 DocumentDB SDK

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

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

Rest API

标头组合起来相当棘手...以下是构建 auth 标头的一些技巧:

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

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

  • 密钥是 Base64 编码的。

  • 要签名的文本应该是utf-8编码的。

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

  • 与所有 HTTP 标头一样,签名(包括签名令牌)应该是 URL 编码的(例如,+ 需要编码为 %2B)。

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

【讨论】:

  • 我看到了这个问题。你能帮助@Andrew Liu吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2022-11-02
      • 2022-01-18
      相关资源
      最近更新 更多