偶尔从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!
答案 0 :(得分:4)
很高兴听到您不再遇到此问题:)
在此发布给所有其他人的利益......
如果您发现此类问题,则表示应用程序和数据库之间存在身份验证标头不匹配。这可能是许多事情的结果......包括不正确的身份验证密钥,系统时钟不同步或生成auth标头的问题。
第一方DocumentDB SDK
如果您使用的是DocumentDB的第一方客户端SDK之一 - 它很可能是一个不正确的身份验证密钥或系统时钟问题......
如果这些看起来不错,那么DocumentDB的结尾就有一个错误。如果您遇到问题 - 请通过一些活动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)
答案 2 :(得分:0)
检查静态客户端方法。可能您误将客户端与只读密钥一起使用。
尝试使用只读键进行写入会引发该异常。