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

如何通过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令牌交换流程:

  1. 生成ADO PAT:创建一个拥有Service Connection (Read)权限的个人访问令牌(PAT)。
  2. 获取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)
    
  3. 交换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:57:32