Unity中从Azurite拉取文件失败,请求认证报错403
针对你遇到的Unity/控制台应用访问Azurite存储报403的问题,按以下步骤排查:
1. 核对签名生成的核心规则
Azurite和云存储的签名逻辑有细节差异,重点检查:
- 日期格式:请求头里的
Date或x-ms-date必须是GMT格式(比如Thu, 02 Nov 2023 12:34:56 GMT),不能用本地时间或ISO格式 - 签名字符串构造:严格按顺序拼接,不能遗漏或颠倒字段,格式为:
注意:空字段也要保留换行,比如没有Content-MD5就留空行VERB\n Content-Encoding\n Content-Language\n Content-Length\n Content-MD5\n Content-Type\n Date\n If-Modified-Since\n If-Match\n If-None-Match\n If-Unmodified-Since\n Range\n x-ms-date\n x-ms-version\n /<account-name>/<container-name>/<file-path> - 账户名与密钥:Azurite默认账户名是
devstoreaccount1,默认密钥是Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==,生成签名前要先把密钥Base64解码,再用HMAC-SHA256加密签名字符串,最后重新Base64编码得到签名值
2. 排查请求头的干扰项
- Unity的WebClient可能自动添加额外头(比如
User-Agent),这些头如果不在签名字符串里,会导致认证失败。建议手动构造HttpWebRequest,精确控制所有请求头 - 确保没有多余的
x-ms-*自定义头,所有添加的x-ms-头必须按字母排序加入签名字符串
3. 启用Azurite调试日志定位问题
修改Docker Compose的Azurite启动命令,开启调试日志:
services: azurite: image: mcr.microsoft.com/azure-storage/azurite command: azurite --blobHost 0.0.0.0 --debug ports: - "10000:10000"
查看Docker日志(docker logs <azurite-container-id>),日志里会明确指出签名不匹配的具体原因,比如「expected signature string xxx, got yyy」,直接对比就能找到问题
4. 用SAS Token快速验证连通性
如果SharedKey认证卡壳,先绕开认证问题验证文件是否可访问:
- 在Azure Storage Explorer里选中目标OBJ文件,右键生成SAS Token,勾选「读」权限
- 把SAS Token拼在文件URL后(比如
http://localhost:10000/devstoreaccount1/mycontainer/model.obj?sv=2022-11-02&ss=b&srt=o&sp=r&se=2023-11-03T12:00:00Z&st=2023-11-02T04:00:00Z&spr=http&sig=xxx),直接在浏览器或Postman里访问,如果能下载文件,说明存储服务本身没问题,问题出在SharedKey签名逻辑
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

