You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:13:45