如何排查Azure Blob Storage的ResourceNotFound错误与认证问题
问题描述
我按照Azure Blob上传API构造了如下HTTParty请求:
#<HTTParty::Request:0x0000000106424558 @changed_hosts=false, @credentials_sent=false, @http_method=Net::HTTP::Put, @last_uri=#<URI::HTTPS https://<account name>.blob.core.windows.net/<container name>/txt-blob>, @options= {:limit=>5, :assume_utf16_is_big_endian=>true, :default_params=>{}, :follow_redirects=>true, :parser=>HTTParty::Parser, :uri_adapter=>URI, :connection_adapter=>HTTParty::ConnectionAdapter, :headers=> {"User-Agent"=>"Httparty", "x-ms-date"=>"Tue, 11 Jul 2023 14:06:07 GMT", "x-ms-version"=>"2018-11-09", "DataServiceVersion"=>"1.0;NetFx", "MaxDataServiceVersion"=>"3.0;NetFx", "Content-Type"=>"application/atom+xml; charset=utf-8", "x-ms-blob-type"=>"BlockBlob", "x-ms-blob-content-type"=>"text/plain; charset=ASCII-8BIT", "Content-Length"=>"5", "Content-MD5"=>"2Oj8otwPiW/Xy0ywAxuiSQ==", "Authentication"=>"SharedKey <account name>:<signed string base64>"}, :body=>"test "}, @path=#<URI::HTTPS https://<account name>.blob.core.windows.net/<container name>/txt-blob>, @raw_request=#<Net::HTTP::Put PUT>>
收到响应:
<Error><Code>ResourceNotFound</Code><Message>The specified resource does not exist</Message></Error>
我怀疑存储账户将该请求视为匿名请求,但不清楚如何修改请求让服务器识别SharedKey认证方案,也难以查看Azure端的请求日志。请问我的请求构造是否存在问题?如何解决该认证识别问题?
解决方案
- 修复认证头名称:将请求头中的
Authentication改为Authorization,Azure Blob Storage仅识别Authorization作为认证头,这是当前无法识别SharedKey的核心原因。 - 移除冗余OData头:删除
DataServiceVersion和MaxDataServiceVersion,这两个头属于OData协议,普通Blob上传请求不需要,避免干扰服务器处理逻辑。 - 验证签名字符串:确保SharedKey签名严格遵循Azure规则:
- 签名字符串必须包含请求方法、Content-MD5、Content-Type、x-ms-date、完整资源路径(容器+Blob名称)等字段
- 使用存储账户的访问密钥,通过HMAC-SHA256算法加密后再进行Base64编码
- 检查资源路径正确性:确认存储账户名、容器名拼写无误,且容器已提前创建(默认无法自动创建容器)
- 启用Azure诊断日志:在Azure门户进入存储账户,依次点击「监控」→「诊断设置」,添加新设置并勾选
StorageRead、StorageWrite等日志类别,将日志保存到存储容器或Log Analytics,几分钟后即可查看请求的详细认证状态与错误细节
内容的提问来源于stack exchange,提问作者ohhh
相关产品推荐
相关产品推荐

