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

使用SAS URI连接ADLS时出现授权头验证错误的原因与解决

问题描述

我持有另一资源组托管的ADLS存储账户的SAS URI,该SAS已配置读取、列表权限。使用此SAS URI连接ADLS时,连接可成功建立,但无法执行文件复制或浏览操作:

  • Databricks报错:Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
  • ADF返回错误提示:
    1. 为服务主体或托管标识授予复制操作的适当权限;
    2. 可能是Azure存储防火墙设置未允许Azure Data Factory的部分IP地址范围;
    3. 远程服务器返回错误:(403) Forbidden.StorageExtendedMessage=Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

该SAS URI在VM上的Azure Storage Explorer中可正常使用并复制文件,说明SAS密钥未过期。

可能原因及解决方法

1. SAS权限或资源类型配置不完整

虽然SAS配置了读取、列表权限,但可能未覆盖ADF/Databricks操作所需的资源层级:

  • 比如SAS仅针对单个文件/目录生成,而ADF复制、Databricks浏览需要容器级别的权限;部分隐式操作(如获取容器元数据)也会触发权限校验。
  • 解决方法:
    • 重新生成SAS时,将资源类型设置为「容器」或「服务」,而非仅「对象」;
    • 确认权限参数包含读取和列表,同时检查SAS的srt(允许的资源类型)参数是否包含c(容器)或o(对象),确保覆盖操作的层级需求。

2. 存储防火墙的网络访问限制

Storage Explorer所在VM的IP已被纳入存储防火墙允许列表,但ADF/Databricks的网络环境未被授权:

  • ADF默认使用微软服务IP池,Databricks集群可能使用虚拟网络或公网IP,这些地址未被存储防火墙放行。
  • 解决方法:
    • 进入ADLS存储账户的「防火墙和虚拟网络」设置,勾选「允许受信任的Microsoft服务访问此存储账户」;
    • 若使用ADF托管虚拟网络,需将该虚拟网络添加到存储防火墙的允许列表;
    • 对于Databricks专用集群,将集群所在虚拟网络的IP段加入存储防火墙允许范围。

3. SAS URI的编码或参数异常

复制SAS URI时可能出现字符截断、重复编码,或者参数被意外修改,导致签名验证失败:

  • 比如手动编辑SAS URI时误改了sig(签名)参数,或粘贴时遗漏了部分字符;部分工具会自动对URI进行二次编码,破坏签名结构。
  • 解决方法:
    • 直接从Azure门户复制完整的SAS URI,避免手动编辑;
    • 在ADF链接服务或Databricks配置中,确保完整粘贴SAS URI(或仅粘贴?之后的token部分,避免参数冲突);
    • 验证SAS URI中的expiry(过期时间)、sig参数是否完整且未被篡改。

4. 服务端API版本或请求格式不兼容

ADF/Databricks的请求API版本、头部格式与Storage Explorer存在差异,导致签名验证不通过:

  • 比如ADF使用的存储API版本过低,无法兼容当前ADLS的签名校验逻辑;Databricks的挂载配置方式错误,导致请求头生成异常。
  • 解决方法:
    • 在ADF链接服务中,将存储账户的API版本设置为2021-06-08或更高的兼容版本;
    • Databricks中使用官方推荐的SAS挂载方式,仅传入token部分而非完整URI:
      spark.conf.set("fs.azure.account.auth.type.<存储账户名>.dfs.core.windows.net", "SAS")
      spark.conf.set("fs.azure.sas.token.provider.type.<存储账户名>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
      spark.conf.set("fs.azure.sas.fixed.token.<存储账户名>.dfs.core.windows.net", "<SAS URI中?后的完整token>")
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:37:05