如何使用托管身份(MI)认证Azure DevOps并运行az命令?
解决托管身份令牌无法认证Azure DevOps CLI的问题
问题核心
使用Linux自托管VM的用户分配托管身份(MI)获取的令牌,替代PAT设置AZURE_DEVOPS_EXT_PAT或通过管道传递给az devops login时,报错Failed to authenticate using the supplied token,无法执行az devops/az repos命令。
根本原因
获取令牌时指定的--resource参数错误:之前使用MI的client_id作为资源标识,拿到的是针对托管身份自身的令牌,而非Azure DevOps服务认可的令牌。Azure DevOps有固定的资源ID,必须针对该ID请求令牌才能被ADO验证通过。
解决方案
1. 获取正确的Azure DevOps令牌
使用Azure CLI获取针对ADO固定资源ID的托管身份令牌:
# Azure DevOps的固定资源ID为499b84ac-1321-427f-aa17-267ca6975798 $accessToken = az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" --query "accessToken" --output tsv
2. 两种认证方式
方式一:通过环境变量认证
设置AZURE_DEVOPS_EXT_PAT环境变量后直接执行命令:
$env:AZURE_DEVOPS_EXT_PAT = $accessToken # 示例:列出组织下的项目 az devops project list --organization https://dev.azure.com/你的组织名
方式二:通过管道传递令牌登录
Write-Output $accessToken | az devops login --organization https://dev.azure.com/你的组织名 # 登录后即可执行后续命令,比如 az repos list --project 你的项目名
额外验证点
- 确认托管身份已被添加为Azure DevOps组织用户,且拥有目标项目的管理员权限
- 确认VM已通过
az login --identity完成托管身份的Azure认证
内容的提问来源于stack exchange,提问作者Callum Hester
相关产品推荐
相关产品推荐

