Azure Cloud Service Worker Role项目初始化DocumentDB时授权令牌错误
解决Azure Worker Role中DocumentDB初始化的授权令牌错误
我之前调试Worker Role项目时也碰到过一模一样的问题——同样的代码在Web API和Console里跑的好好的,一到Worker Role里就报这个授权令牌错误。结合我的排查经验,给你几个大概率能解决问题的方向:
1. 优先检查虚拟机时钟同步
Azure Worker Role运行的虚拟机如果和UTC时间有偏移,就会触发DocumentDB的签名时间校验失败。虽然Azure默认会同步时钟,但偶尔会出现实例时钟漂移的情况:
- 可以远程登录到Worker Role实例,检查系统时间是否和UTC一致;
- 如果不想远程操作,也可以在代码里临时放宽时间校验(仅用于排查,不推荐长期使用):
var client = new DocumentClient(new Uri(endpointUri), primaryKey, new ConnectionPolicy { RequestTimeout = TimeSpan.FromSeconds(30), EnableEndpointDiscovery = true, RetryOptions = new RetryOptions { MaxRetryAttemptsOnThrottledRequests = 5, MaxRetryWaitTimeInSeconds = 30 }, // 临时允许5分钟的时间偏移 ClockSkew = TimeSpan.FromMinutes(5) });
2. 确认配置读取的正确性
Worker Role的配置加载机制和Web API/Console有差异,很容易出现读取不到正确密钥的情况:
- 不要硬编码密钥,一定要用
CloudConfigurationManager.GetSetting从Worker Role的配置文件(ServiceConfiguration.cscfg)里读取; - 检查配置文件里的
DocumentDbPrimaryKey有没有多余的空格或者特殊字符,复制粘贴密钥时经常会不小心带进去; - 确保在初始化DocumentDB客户端之后才去访问仓库,避免配置还没加载完成就生成请求签名。
3. 核对资源路径的准确性
错误信息里提到了get colls dbs/MyD...,说明签名生成时用的资源路径可能不完整:
- 检查数据库名称是不是拼写正确,有没有少写字符;
- 如果是手动构造请求(不是用官方SDK),要确认HTTP方法、资源类型、资源路径完全符合DocumentDB的协议规范,比如获取集合的路径应该是
dbs/{db-id}/colls,不能有拼写错误。
4. 升级Cosmos DB SDK版本
旧版本的DocumentDB SDK在Worker Role环境下可能存在签名生成的兼容性问题,建议直接升级到最新的Microsoft.Azure.Cosmos包(现在DocumentDB已经改名为Cosmos DB了),并且保证和Web API/Console项目里用的版本一致。
5. 排查网络防火墙规则
虽然Web API和Console能访问,但Worker Role可能处于不同的虚拟网络中,被Cosmos DB的防火墙拦截:
- 登录Azure门户,检查Cosmos DB账户的防火墙设置,确保允许Worker Role所在的虚拟网络或者实例IP地址访问;
- 可以临时设置为允许所有IP访问,验证是不是防火墙的问题,之后再改回严格的规则。
一般来说,前两个原因是最常见的,先从这两点入手排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者Abzurde
相关产品推荐
相关产品推荐

