诊断和排查 Azure Cosmos DB 未经授权异常

适用范围: NoSQL

HTTP 401:HTTP 请求中的 MAC 签名与计算出的签名不同。 如果收到 401 错误消息“HTTP 请求中的 MAC 签名与计算出的签名不同”,这可能是由以下情况所致。

对于较旧的 SDK,异常可能显示为无效的 JSON 异常,而不是正确的 401 未经授权异常。 较新的 SDK 可以正确处理此情况,并提供有效的错误消息。

疑难解答步骤

以下列表包含未经授权异常的已知原因和解决方案。

密钥未正确轮换是最常见的情况

密钥轮换后不久就会出现 401 MAC 签名问题,但无需进行任何更改,它最终会停止。

解决方案:

密钥已轮换,且没有遵循最佳做法。 完成 Azure Cosmos DB 帐户密钥轮换耗时几秒到几天不等,具体取决于 Azure Cosmos DB 帐户大小。

密钥配置错误

401 MAC 签名问题持续出现并在使用该密钥的所有调用中发生。

解决方案:

密钥在应用程序上配置错误,且帐户使用了错误密钥或未复制整个密钥。

应用程序使用只读密钥进行写入操作

401 MAC 签名问题仅发生在创建或替换等写入操作中,但读取请求会成功。

解决方案:

切换应用程序以使用读/写密钥,从而允许操作成功完成。

创建容器时出现争用情况

创建容器后不久会看到 401 MAC 签名问题。 此问题仅会在容器创建完成前发生。

解决方案:

创建容器时出现争用状况。 在容器创建完成之前,某个应用程序实例正在尝试访问容器。 出现此争用条件的最常见情况是,应用程序正在运行就删除了容器,并重新创建了同名的容器。 SDK 尝试使用新容器,但由于容器创建仍在进行,因此无法获得密钥。

启用批量模式

使用启用批量模式时,读取和写入操作进行了优化,以获得最佳网络性能,并通过专用的批量 API 发送到后端。 启用批量模式执行读取操作时出现 401 错误,这通常表示应用程序正在使用只读密钥

解决方案

启用批量模式执行操作时,请使用读/写密钥或具有写入访问权限的授权机制。

后续步骤