DocumentDB UnauthorizedException:“HTTP请求中找到的MAC签名与计算签名不同。”

时间:2015-12-25 10:22:37

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

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

3 个答案:

答案 0 :(得分:4)

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

在此发布给所有其他人的利益......

如果您发现此类问题,则表示应用程序和数据库之间存在身份验证标头不匹配。这可能是许多事情的结果......包括不正确的身份验证密钥,系统时钟不同步或生成auth标头的问题。

第一方DocumentDB SDK

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

如果这些看起来不错,那么Doc​​umentDB的结尾就有一个错误。如果您遇到问题 - 请通过一些活动ID +时间戳+堆栈跟踪与我联系(askcosmosdb {at} microsoft.com),我可以帮助您查看问题。

Rest API

汇总起来相当棘手......以下是构建auth标头的一些提示:

  • 使用基于身份的路由时,所有参数(动词,资源类型,日期等)必须是小写,然后才能签署除外。

  • 对于基于身份的路由,您需要签署资源的完整路径(例如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

答案 1 :(得分:2)

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

enter image description here

答案 2 :(得分:0)

检查静态客户端方法。可能您误将客户端与只读密钥一起使用。

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