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

使用容器级SAS令牌访问Blob资源时签名不匹配问题求助

容器级SAS令牌访问容器内资源的问题解答

当然可以用容器级SAS令牌访问容器内的资源,你遇到的「Signature did not match」错误,核心原因大概率是URL拼接格式不正确,导致签名验证时的字符串不匹配。

先明确核心结论

容器级SAS令牌(通过container.GetSharedAccessSignature生成)完全支持访问该容器下的所有Blob资源,只要你配置的权限(比如你设置的Read)正确、令牌在有效期内,就可以正常访问。

错误原因分析

从你给出的错误信息来看:

Signature did not match. String to sign used was r 2023-05-14T05:48:34Z /blob/myblobname/2017-med 2017-07-29

这里的签名字符串部分/blob/myblobname/2017-med存在问题——正确的签名字符串里,这部分应该是/{你的存储账户名}/{容器名},而不是/blob/{存储账户名}/{容器名}。这说明你拼接的访问URL格式错误,导致服务端生成的签名验证字符串和你请求时的不匹配。

正确的URL拼接方式

假设你的存储账户名为myblobname,容器名为2017-med,要访问的Blob路径为data/report.pdf,生成的SAS令牌为?sv=2022-11-02&sr=c&sig=xxx...&se=2028-05-14T05:48:34Z&sp=r,那么正确的访问URL应该是:

https://myblobname.blob.core.windows.net/2017-med/data/report.pdf?sv=2022-11-02&sr=c&sig=xxx...&se=2028-05-14T05:48:34Z&sp=r

简单来说,格式规则是:
https://{存储账户名}.blob.core.windows.net/{容器名}/{Blob相对路径}?{容器级SAS令牌}

额外检查点

  • 确认生成的SAS令牌中包含sr=c参数:这个参数表示是容器级SAS,如果你的令牌里是sr=b,那说明生成的是Blob级SAS,无法访问容器内的其他Blob,但你的代码是调用容器对象的GetSharedAccessSignature,所以应该是sr=c。
  • 核对存储账户名:确保URL中的存储账户名和你代码里_account对应的账户名一致,错误信息里的myblobname是否是你实际的存储账户名?
  • 检查有效期:你的SAS设置了5年有效期,要确保当前时间在SharedAccessExpiryTime范围内。

验证小技巧

你可以先尝试用容器级SAS访问容器本身(比如给SAS加上List权限,列出容器内的Blob),确认容器访问正常后,再拼接Blob路径访问具体资源,这样更容易定位问题。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:31:30