在Azure Data Factory中调用Get Blob API遇认证错误,咨询可行性与方案
问题:ADF中调用Blob REST API认证失败及二进制数据导入SQL需求
我在Azure Data Factory(ADF)里尝试调用Get Blob API,结果收到错误:
"Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature."
我的需求是读取图片或非结构化文件,把二进制数据插入SQL Server的varchar(max)列里。当前管道配置如下:
- 链接服务:
- 类型:Rest
- 基础URL:
https://{account name}.blob.core.windows.net/ - 身份验证类型:匿名
- 服务器证书:已禁用
- 数据集:
- 类型:Rest
- 相对URL:
{container name}/xyz.jpeg
- 复制数据活动:
- 请求方法:
get - 请求头:
x-ms-date:@concat(formatDateTime(utcNow(), 'yyyy-MM-ddTHH:mm:ss'), 'Z')x-ms-version:2018-11-09x-ms-blob-type:BlockBlobAuthorization:SharedKey {storage name}:CBntp....{SAS key}....LsIHw%3D(该密钥取自SAS连接字符串的https&sig=CBntp{SAS key}LsIHw%3D部分)
- 请求方法:
想请教两个问题:
- 能不能在ADF管道里调用Azure Blob REST API?
- 怎么解决这个认证错误?
解决方案
一、ADF调用Blob REST API的可行性
完全可以,但其实没必要舍近求远——ADF本身内置了Azure Blob存储的专属连接器,直接用这个连接器处理二进制文件,比手动构造REST API请求简单得多,还能避开认证、请求头构造这类容易出错的环节。当然,如果业务场景确实需要用REST API方式,ADF是支持的。
二、认证错误的解决方法
你当前的问题核心是混用了SharedKey和SAS两种认证方式:
- 错误根源:
Authorization头用的是SharedKey格式,但你填入的是SAS的签名部分。SharedKey需要用存储账户的原始访问密钥生成签名,而SAS是独立的认证机制,不需要Authorization头,而是直接把SAS参数拼接在请求URL里。 - 两种修正方案任选其一:
- 方案1:改用SAS认证(推荐,更简单)
- 把链接服务的身份验证类型从「匿名」改成「SAS」。
- 将完整的SAS令牌(从
?sv=开始到结尾的全部内容)填入链接服务的SAS令牌字段。 - 复制数据活动里删掉
Authorization、x-ms-date、x-ms-blob-type这些手动添加的请求头——SAS认证会自动处理这些参数,手动添加反而会导致签名不匹配。 - 数据集的相对URL保持
{container name}/xyz.jpeg即可。
- 方案2:正确使用SharedKey认证
- 链接服务身份验证类型改成「账户密钥」,填入存储账户的原始访问密钥(不是SAS的sig片段)。
- 复制数据活动里不需要手动编写
Authorization头,ADF会自动生成符合要求的签名和请求头,你只需要确保x-ms-version设置正确即可。
- 方案1:改用SAS认证(推荐,更简单)
- 针对你的业务需求的额外建议:如果只是要把二进制文件导入SQL Server的varchar(max)列,直接用ADF的Blob存储连接器作为源,SQL Server作为目标即可。在复制活动中设置源为二进制格式,然后将源数据映射到目标的varchar(max)列,整个过程不需要调用任何API,配置更简单、效率也更高。
内容的提问来源于stack exchange,提问作者Aussie
相关产品推荐
相关产品推荐

