使用HttpRequestMessage上传Azure Blob报403 Forbidden错误求助
排查Azure Blob PUT请求403 Forbidden错误的原因
从你提供的信息来看,导致403错误的核心问题是签名字符串不完整,同时还有日期不匹配的问题,具体分析如下:
1. 签名遗漏了关键请求头部
Azure Blob存储的SharedKey签名要求必须包含所有与请求相关的特殊头部和标准HTTP头部(如果存在的话)。你的PUT上传BlockBlob请求实际包含了Content-Length和Content-MD5头部,但生成签名的原始字符串里完全没有这两个字段,这直接导致签名验证失败。
你当前使用的签名字符串:
PUT 11 x-ms-blob-type:BlockBlob x-ms-date:Thu, 10 May 2018 16:00:21 GMT x-ms-version:2017-07-29 /MyStorage/dbstore/myFolder/test2.txt
正确的签名字符串应该包含Content-MD5和Content-Length,并且头部要按字母顺序排列(这是Azure签名的硬性要求),格式如下:
PUT CAQ66JnJH0H9GhrLTy+b1w== 11 x-ms-blob-type:BlockBlob x-ms-date:Fri, 11 May 2018 06:39:35 GMT x-ms-version:2017-07-29 /MyStorage/dbstore/myFolder/test2.txt
注意:
Content-MD5的值要和请求中的完全一致(即你提供的CAQ66JnJH0H9GhrLTy+b1w==)- 每个字段之间的空行要严格对应(比如PUT方法后的空行、Content-MD5与Content-Length之间的换行等)
2. 签名中的日期与实际请求日期不匹配
你生成签名时用的x-ms-date是Thu, 10 May 2018 16:00:21 GMT,但实际请求里的x-ms-date是Fri, 11 May 2018 06:39:35 GMT,两者完全不一致。Azure会严格验证签名中的日期和请求头部的日期是否相同,不匹配也会直接返回403。
修复步骤
- 确保签名字符串包含所有请求中存在的头部:对于PUT上传Blob,至少要包含
Content-Length、Content-MD5(如果设置了的话)、x-ms-blob-type、x-ms-date、x-ms-version - 所有头部必须按字母顺序排列(比如
Content-Length在Content-MD5前面,x-ms-blob-type在x-ms-date前面) - 签名中的
x-ms-date必须和请求头部的x-ms-date完全一致 - 严格按照Azure的签名格式要求处理换行和空行(每个部分之间的换行不能少,也不能多)
另外,既然你的SharedKey在GET请求中能正常使用,说明存储账户名和密钥本身是没问题的,重点就放在签名字符串的完整性和准确性上。
内容的提问来源于stack exchange,提问作者Karen Avdalyan
相关产品推荐
相关产品推荐

