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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:50:16