Azure Pipelines中使用工作负载身份联合实现全局认证的正确方式
在Azure Pipelines中使用工作负载身份联合认证的正确方式
问题根源分析
你之前的尝试出现挂起、令牌失效问题,核心原因在于:AzureCLI@2任务本身会自动处理工作负载身份的认证流程,手动执行az login会和任务内置逻辑冲突;单独bash任务未正确配置环境依赖,导致无法获取有效联合令牌。
正确实现方案
要让所有后续任务复用工作负载身份的认证上下文,需通过管道变量传递认证信息或全局配置CLI上下文两种方式实现:
方案1:跨任务传递认证信息(适用于托管/自托管代理)
通过AzureCLI@2完成初始认证,将核心认证参数导出为管道变量,供后续任务直接复用:
- task: AzureCLI@2 displayName: '初始化工作负载身份认证' inputs: azureSubscription: 'my_workload_identity' # 选择已配置的工作负载身份服务连接 scriptType: bash inlineScript: | # 导出访问令牌与订阅ID为管道变量 echo "##vso[task.setvariable variable=AZURE_ACCESS_TOKEN]$(az account get-access-token --output tsv --query accessToken)" echo "##vso[task.setvariable variable=AZURE_SUBSCRIPTION_ID]$(az account show --output tsv --query id)" addSpnToEnvironment: true # 后续任务直接复用认证变量 - bash: | # 配置Azure CLI使用已有认证 export AZURE_ACCESS_TOKEN=$(AZURE_ACCESS_TOKEN) export AZURE_SUBSCRIPTION_ID=$(AZURE_SUBSCRIPTION_ID) export AZURE_TENANT_ID=$(AZURE_TENANT_ID) # 验证Key Vault访问 az keyvault secret list --vault-name your-keyvault-name displayName: '验证Key Vault权限'
方案2:全局配置CLI上下文(仅适用于自托管代理)
自托管代理环境持久化,可直接登录并保存CLI上下文,后续任务自动读取:
- bash: | # 使用工作负载身份登录并设置默认订阅 az login --federated-token "$(cat $AZURE_FEDERATED_TOKEN_FILE)" --service-principal -u $(AZURE_CLIENT_ID) -t $(AZURE_TENANT_ID) az account set --subscription your-subscription-id # 验证登录有效性 az account show displayName: '全局登录工作负载身份' env: AZURE_CLIENT_ID: $(AZURE_CLIENT_ID) AZURE_TENANT_ID: $(AZURE_TENANT_ID)
关键注意事项
- 禁止在
AzureCLI@2任务内手动执行az login:该任务会自动通过指定的服务连接完成认证,手动登录会触发内置逻辑冲突,导致任务挂起或令牌被清除。 - 管道变量传递限制:
addSpnToEnvironment: true仅在当前AzureCLI@2任务生效,必须通过##vso[task.setvariable]将令牌等核心信息转为全局管道变量,才能跨任务复用。 - 权限与信任验证:确认工作负载身份已被授予Key Vault的对应权限(如
Key Vault Secrets Reader),且Azure AD已配置好与Azure Pipelines的联合身份信任关系。
内容的提问来源于stack exchange,提问作者kiesel
相关产品推荐
相关产品推荐

