如何使用容器级SAS令牌通过HTTP调用下载Azure存储内zip文件
问题原因
你生成的是容器范围的Account Key SAS,URL里的sr=c参数就代表这是容器级SAS,鉴权范围覆盖整个data容器下的所有Blob,但你当前的请求地址只指向容器根路径,没有指定具体要访问的.zip文件路径;同时你给SAS只分配了读取(sp=r)权限,没有分配列表权限,直接请求容器根路径自然会触发授权错误。
你生成SAS的操作界面参考:
纯HTTP下载正确操作
不需要额外工具,直接按以下步骤构造请求即可:
- 提取现有SAS URL中
?及之后的完整鉴权参数字符串,不要修改任何参数内容。 - 拼接具体Blob文件的访问地址,格式如下:
举个例子,如果容器根目录下的zip文件名为https://<STORAGE_ACCOUNT>.blob.core.windows.net/data/<你的.zip文件完整路径>?<提取到的完整SAS鉴权参数>test.zip,最终请求地址为:
如果zip文件存放在容器的子目录下,比如https://<STORAGE_ACCOUNT>.blob.core.windows.net/data/test.zip?sp=r&st=2022-06-06T15:23:31Z&se=2022-06-06T23:23:31Z&spr=https&sv=2020-08-04&sr=c&sig=<SIGNATURE>backup/june/data.zip,把对应的相对路径补到data/后面即可。 - 直接向构造好的地址发送HTTP GET请求,不需要额外添加
Authorization请求头,SAS参数本身已经包含完整鉴权信息,就能直接下载文件。
常见鉴权失败排查点
- 必须使用HTTPS协议发起请求:你生成的SAS带有
spr=https参数,强制要求HTTPS协议,HTTP请求会直接被拒绝授权。 - 确认请求时间在SAS有效期内:你示例中的SAS有效期为UTC时间2022-06-06 15:23:31到2022-06-06 23:23:31,超出时间窗口的请求会鉴权失败。
- 不要修改SAS参数的任何字符:包括签名
sig、权限sp、有效期se在内的所有参数,任意字符改动都会导致签名校验不通过。 - 文件名不要写错:注意文件名大小写,Azure Blob的文件名是大小写敏感的,路径和文件名不匹配也会报授权或不存在错误。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

