Azure Blob存储SAS URL访问出现AuthenticationFailed错误的问题咨询
Azure Blob存储SAS URL访问出现AuthenticationFailed错误的问题咨询
问题描述
我尝试通过Blob SAS URL列出容器中的PDF文件,请求地址如下:
GET https://testtestsitweu.blob.core.windows.net/publicfiles?sp=rl&st=2024-02-15T14:18:59Z&se=2025-02-15T22:18:59Z&spr=https&sv=2022-11-02&sr=c&sig=TxAaaaaaaaaaaaaaaaaaaaaagU%3D
虽然这个SAS已经包含了「读取(r)」和「列出(l)」权限,但还是收到了认证失败的错误:
return (<Error> <Code>AuthenticationFailed</Code> <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:b5d14821-701e-0083-2939-6363a8000000 Time:2024-02-19T13:42:06.9875994Z</Message> <AuthenticationErrorDetail>Signature did not match. String to sign used was rl 2024-02-15T14:18:59Z 2025-02-15T22:18:59Z /blob/testtest/$root https 2022-11-02 c </AuthenticationErrorDetail> </Error> )
我有几个疑问:
- 明明用了带权限的SAS,为什么还会要求Authorization头?
- 我想在公开网页上托管静态内容(PDF、DOCX),是不是用错工具了?
问题分析与解决方案
核心原因:SAS签名与访问资源不匹配
从错误信息里的AuthenticationErrorDetail可以看到,Azure用来验证签名的字符串包含/blob/testtest/$root,但你实际访问的是publicfiles容器——这说明你生成的SAS是绑定到testtest容器或者$root根容器的,并不是publicfiles容器的SAS。SAS签名是和特定资源强绑定的,资源不匹配就会触发认证失败。
解答你的疑问
为什么要求Authorization头?
正常情况下,正确的SAS URL本身已经包含了所有认证信息,不需要额外添加Authorization头。现在出现这个提示,本质是签名验证失败,系统认为你的请求没有合法授权,并不是真的需要你手动添加授权头。工具选择是否正确?
Azure Blob存储完全适合托管静态内容(PDF、DOCX、图片等),你没选错工具,只是权限配置或SAS生成时出了小问题。
具体解决步骤
方案1:重新生成正确的SAS URL
- 登录Azure门户,找到你的存储账户,进入
publicfiles容器 - 点击「生成SAS」按钮,确保:
- 权限勾选「读取(r)」和「列出(l)」
- 有效期范围和你需要的一致
- 生成的SAS URL路径是
/publicfiles(确认URL里的容器名正确)
- 用新生成的SAS URL发起请求,应该能正常列出容器内的文件。
方案2:设置容器为公共访问(无需SAS)
如果你的目标是让所有人都能直接访问这些静态文件,不需要控制访问有效期,更简单的方式是设置容器的公共访问级别:
- 进入
publicfiles容器的「概述」页面,点击「更改访问级别」 - 选择「Blob(匿名读取对容器中 blob 的读取权限)」,保存设置
- 之后就可以用类似
https://testtestsitweu.blob.core.windows.net/publicfiles/你的文件.pdf的URL直接访问,不需要任何认证信息。
备注:内容来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

