在Azure DevOps流水线中用工作负载身份从Blob下载Zip遇403错误
问题描述
我需要从Azure Blob存储下载一个Zip文件,URL为:https://stgtest.blob.core.windows.net/test/5f623b13-1932-4b03-89f9-1024a3fcf949.zip。此前已通过启用Workload Identity的AKS Pod中的Java代码成功上传该文件,所用身份拥有Storage Blob Data Contributor和Storage Blob Data Reader角色。
现在要在另一Azure DevOps流水线中下载该文件,流水线运行在启用相同Workload Identity的AKS Pod自托管代理中,但不能使用Java代码,只能依赖流水线脚本。尝试通过Pod自身获取令牌下载失败,使用的Bash任务如下:
- task: Bash@3 displayName: 'download' inputs: targetType: 'inline' script: | result_data_url=xxxx STORAGE_ACCESS_TOKEN=$(curl -s -X POST -H "Metadata: true" \ -d "grant_type=client_credentials" \ -d "client_id=$AZURE_CLIENT_ID" \ -d "client_assertion=$(cat $AZURE_FEDERATED_TOKEN_FILE)" \ -d "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" \ -d "scope=https://storage.azure.com/.default" \ "https://login.microsoftonline.com/$AZURE_TENANT_ID/oauth2/v2.0/token" | jq -r .access_token) curl -L -D headers.txt -H "Authorization: Bearer $STORAGE_ACCESS_TOKEN" "$result_data_url" -o "$(Build.ArtifactStagingDirectory)/result.zip" cat headers.txt
执行后收到403错误:
HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. Content-Length: 438 Content-Type: application/xml Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: b3cddacb-901e-0006-17f8-6bd6c5000000 Date: Tue, 21 Jan 2025 11:36:54 GMT
环境变量由Pod的Workload Identity自动填充,我认为获取的令牌与上传时类似,请问错误原因是什么?
可能的错误原因及修复方案
- 令牌受众或范围不匹配:检查获取的令牌
aud字段是否为https://storage.azure.com/。可以用jwt $STORAGE_ACCESS_TOKEN解码令牌查看,若受众不正确,确认请求中的scope参数是否拼写正确,或租户配置是否存在异常。 - Workload Identity绑定错误:确认AKS自托管代理Pod的ServiceAccount是否正确绑定到上传文件时使用的Azure AD应用程序。检查ServiceAccount的
azure.workload.identity/client-id注解是否与上传时的一致,避免使用了不同的身份。 - 权限作用域不足:虽然身份拥有Storage Blob Data Contributor/Reader角色,但需确认角色分配的作用域是否覆盖目标Blob容器(
test容器)或存储账户。若角色仅分配给特定资源组或更小范围,会导致无法访问目标Blob。同时确认角色是直接分配给Workload Identity对应的AD应用,而非通过未正确包含该应用的组分配。 - curl请求格式问题:
- 验证
Authorization头格式是否正确,无多余空格,令牌未被截断。可打印$STORAGE_ACCESS_TOKEN确认完整性(注意不要泄露令牌)。 - 添加
x-ms-version: 2021-08-06或更高版本的请求头,部分旧版Blob API对Bearer令牌的支持有限。
- 验证
- 联邦令牌失效:检查
$AZURE_FEDERATED_TOKEN_FILE中的JWT是否过期,解码后查看exp字段确认有效期。若已过期,需确认Pod的Workload Identity是否正常刷新令牌。
内容的提问来源于stack exchange,提问作者jereesh thomas
相关产品推荐
相关产品推荐

