Azure存储Blob容器浏览器访问报AuthenticationFailed,无法查看Blob列表
报错核心根因
你遇到的AuthenticationFailed错误,本质是SAS签名的绑定资源和实际访问的资源不匹配,和是否开启公共访问没有直接关系。
什么是“签名不匹配”
SAS令牌的认证逻辑是固定的:
- 生成SAS的时候,系统会用存储账户的密钥,把「目标资源完整路径、授予权限、生效/过期时间、存储API版本、资源类型」等所有参数按Azure规定的固定格式拼成长字符串,加密计算得到
sig签名值。 - 服务端收到带SAS的请求时,会用同样的存储账户密钥,结合你实际请求的资源路径、请求里带的所有SAS参数,按完全一样的规则重新计算签名值。如果两边算出来的
sig值对不上,就会抛出“Signature did not match”的错误。
你错误详情里服务端打印的待签字符串是:
rl 2021-02-08T20:58:42Z 2021-03-09T20:58:00Z /blob/teststorageaccount21/$root 2019-12-12 c
这里面对应的目标资源是teststorageaccount21存储账户下的**$root根容器**,但你实际把这个SAS拼到了publicc自定义容器的访问链接上,相当于拿给A对象做的防伪签名去校验B对象,自然过不了认证。
为什么开了公共访问还会触发校验
Azure Blob的公共访问规则是:如果容器配置了公共读取权限,匿名请求本来不需要任何鉴权就能列出Blob列表、读取Blob内容。但只要你在请求链接里带了sig这类SAS鉴权参数,服务端就会优先走SAS校验逻辑,不会直接放通匿名访问。
你之前能正常访问单个Blob,是因为那个Blob的SAS本身就是针对MyTest1.csv正确生成的,签名和资源路径完全匹配,所以能正常通过校验。
对应解决方案
根据你的实际需求选对应操作:
- 如果你就是要给所有用户开放公共读权限,完全不需要在链接里加任何SAS参数。直接访问容器的列表接口即可:
https://teststorageaccount21.blob.core.windows.net/publicc?restype=container&comp=list,无需鉴权就能返回容器下所有Blob的列表。 - 如果你不想开放全量公共访问,只想给指定用户发带有效期的临时访问权限,重新在存储资源管理器生成容器SAS时,注意核对:
- 选中的目标对象必须是
publicc容器,不能误选存储账户下的$root根容器 - 权限勾选“读取”+“列表”(也就是你之前选的
rl权限组合是正确的,只是选错了绑定资源) - 生成的SAS对应的待签路径应该是
/blob/teststorageaccount21/publicc,而不是之前错误的$root路径,此时拼出的链接就不会出现签名不匹配的报错。
- 选中的目标对象必须是
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

