如何通过OIDC工作负载身份联合的ADO服务连接生成Azure管理API访问令牌
使用OpenID Connect工作负载身份联合的ADO服务连接生成Azure管理API访问令牌
在ADO Pipeline中获取令牌(推荐)
如果是在ADO流水线里调用Azure管理API,直接利用服务连接的上下文就能快速获取令牌,无需手动处理OIDC交换:
方法1:Azure CLI任务
添加一个Azure CLI任务,指定已创建的OIDC工作负载身份联合服务连接,然后执行以下命令提取令牌:
# 获取访问令牌并提取出accessToken字段 ACCESS_TOKEN=$(az account get-access-token --resource https://management.azure.com/ --query accessToken -o tsv) # 后续调用PUT API示例 curl -X PUT "https://management.azure.com/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/{resource-provider}/{resource-type}/{resource-name}?api-version=2023-01-01" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "your": "payload" }'
方法2:Azure PowerShell任务
添加Azure PowerShell任务并关联目标服务连接,通过Az模块获取令牌:
# 获取当前上下文并提取访问令牌 $context = Get-AzContext $token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate( $context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://management.azure.com/" ).AccessToken # 调用PUT API示例 $apiUrl = "https://management.azure.com/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/{resource-provider}/{resource-type}/{resource-name}?api-version=2023-01-01" $headers = @{ "Authorization" = "Bearer $token" "Content-Type" = "application/json" } $payload = @{ your = "payload" } | ConvertTo-Json Invoke-RestMethod -Method Put -Uri $apiUrl -Headers $headers -Body $payload
离线/本地测试时获取令牌
如果需要在流水线外手动获取令牌,需完成OIDC令牌交换流程:
- 生成ADO PAT:创建一个拥有
Service Connection (Read)权限的个人访问令牌(PAT)。 - 获取ADO OIDC ID令牌:向ADO端点发送POST请求,替换占位符为实际值:
ORG_NAME="your-org-name" SERVICE_CONN_ID="your-service-connection-guid" AZURE_SP_ID="azure-ad-service-principal-or-mi-id" PAT="your-pat-token" # 编码PAT用于请求头 ENCODED_PAT=$(echo -n ":$PAT" | base64) # 请求ID令牌 ID_TOKEN=$(curl -X POST "https://dev.azure.com/$ORG_NAME/_apis/connectionDetails?api-version=7.1-preview.1" \ -H "Authorization: Basic $ENCODED_PAT" \ -H "Content-Type: application/json" \ -d '{ "serviceConnectionId": "'$SERVICE_CONN_ID'", "requestedServicePrincipalId": "'$AZURE_SP_ID'", "resource": "https://management.azure.com/" }' | jq -r .idToken) - 交换为Azure访问令牌:向Azure AD令牌端点发送POST请求,替换租户ID:
拿到TENANT_ID="your-azure-tenant-id" ACCESS_TOKEN=$(curl -X POST "https://login.microsoftonline.com/$TENANT_ID/oauth2/v2.0/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \ -d "client_id=$AZURE_SP_ID" \ -d "assertion=$ID_TOKEN" \ -d "scope=https://management.azure.com/.default" \ -d "requested_token_use=on_behalf_of" | jq -r .access_token)ACCESS_TOKEN后即可用于API请求头。
注意:访问令牌的受众必须指定为
https://management.azure.com/,否则Azure管理API会拒绝请求。
内容的提问来源于stack exchange,提问作者aravind
相关产品推荐
相关产品推荐

