通过SAS URI访问Azure Blob时Authentication failed错误排查
Azure Blob Storage SAS URI 签名错误排查与解决事项
问题背景
我们团队使用NextJS开发Web应用,近期集成Azure Blob Storage实现文件上传与展示。负责前端图片展示模块时,通过generateBlobSASQueryParameters函数生成SAS令牌,参数包含容器名、Blob名、startsOn(日期对象)、expiresOn(日期对象),权限设置为BlobSASPermissions.parse("racwdt")。生成SAS URI后访问时,收到错误:服务器无法验证请求,签名字段格式不正确。
错误的SAS URI:
https://mystorageaccount.blob.core.windows.net/images/example.png?sv=2021-06-08&ss=bfqt&srt=sco&sp=rwdlacupiytfx&se=2022-11-22T20:45:23Z&st=2022-10-03T11:45:23Z&spr=https&sig=ECjnJEvZCOPhvuOgCsGBMIwone7VmsiJQopVNyb4yB0%3D?sv=2021-06-08&st=2022-10-06T06%3A24%3A12Z&se=2022-10-06T06%3A34%3A12Z&sr=b&sp=racwdt&sig=ioMMCIFo0eXC%2BTZ9yDZB9D5JHz%2F%2BUyMMFqTPEG0QSqg%3D
失败URL提取的参数:
sv=2021-06-08 ss=bfqt srt=sco sp=rwdlacupiytfx se=2022-11-22T20:45:23Z st=2022-10-03T11:45:23Z spr=https sig=ECjnJEvZCOPhvuOgCsGBMIwone7VmsiJQop
注:通过Blob的「生成SAS令牌和URL」按钮手动生成的SAS URI可正常访问。
解决注意事项
- 禁止重复拼接SAS参数:从错误URI可见,末尾重复追加了一整套SAS参数(第二个
?后的内容),导致参数冲突、签名验证失败。正确做法是:Blob基础URL后仅拼接一次generateBlobSASQueryParameters返回的完整查询字符串,不要叠加重复参数。 - 保证签名参数完整:失败参数中的
sig被截断(原生成的sig=ECjnJEvZCOPhvuOgCsGBMIwone7VmsiJQopVNyb4yB0%3D变成sig=ECjnJEvZCOPhvuOgCsGBMIwone7VmsiJQop),签名是完整的Base64编码字符串,截断后必然触发验证失败。需检查拼接过程中是否存在字符截断、URL编码错误。 - 对齐资源类型与权限范围:手动生成的SAS包含
sr=b(指定资源类型为Blob),而代码生成的参数缺少该字段,同时权限sp值也不匹配(代码用racwdt,错误URL中是rwdlacupiytfx)。需确保代码中指定resource参数为'b'(Blob级SAS),权限字符串与实际需求一致,避免冗余权限导致签名计算不匹配。 - 统一日期格式与时区:
startsOn和expiresOn必须采用UTC时间格式(ISO 8601,如YYYY-MM-DDTHH:mm:ssZ),确保代码中日期对象正确转换为UTC时间,避免本地时区偏差引发签名验证失败。 - 确认存储服务版本兼容:检查代码中使用的
sv版本(2021-06-08)与Azure存储账户支持的版本一致,同时generateBlobSASQueryParameters的参数要符合所选版本的要求,部分版本对权限字段格式有严格限制。 - 校验签名计算的参数完整性:SAS签名基于所有指定参数(容器名、Blob名、权限、起止时间、服务版本等)生成,任何参数遗漏或错误都会导致签名不匹配。对比手动生成的SAS参数,确保代码传入
generateBlobSASQueryParameters的所有参数与手动生成时一致(如spr=https是否正确设置、srt/ss是否符合需求)。
内容的提问来源于stack exchange,提问作者Ariel K.
相关产品推荐
相关产品推荐

