如何在Azure DevOps流水线中获取AD用户订阅列表及验证PR创建者身份
实现Azure DevOps流水线中的两个AD用户订阅相关需求
一、流水线构建过程中获取AD用户的订阅列表
- 核心API:Azure Resource Manager (ARM) 订阅列表接口
GET https://management.azure.com/subscriptions?api-version=2020-01-01 - 实现要点:
- 身份验证:需要目标AD用户的有效访问令牌,可通过Azure CLI的
az account get-access-token命令获取,或调用Azure AD令牌端点https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token生成。 - 权限要求:目标用户需拥有
Microsoft.Subscriptions/subscriptions/read权限(可通过Reader角色或自定义RBAC角色分配),同时需Azure AD的User.Read权限用于身份验证。 - 流水线示例(Azure CLI步骤):
- task: AzureCLI@2 inputs: azureSubscription: '你的服务连接名称' scriptType: 'bash' inlineScript: | # 获取当前服务连接关联用户的订阅列表 az account list --output table # 切换到指定AD用户上下文并获取订阅(需用安全变量存储凭据) az login --username "$TARGET_USER_EMAIL" --password "$TARGET_USER_PWD" --tenant "$TENANT_ID" az account list --output json
- 身份验证:需要目标AD用户的有效访问令牌,可通过Azure CLI的
二、PR验证步骤:检查创建者身份并获取其订阅列表
- 关键API组合:
- Azure DevOps PR详情接口:获取创建者的AD关联信息
从响应中提取GET https://dev.azure.com/{org}/{proj}/_apis/git/repositories/{repo-id}/pullrequests/{pr-id}?api-version=7.1-preview.1createdBy.uniqueName(用户AD邮箱)或createdBy.aadObjectId(AD对象ID)。 - Microsoft Graph用户详情接口:验证用户身份合法性
GET https://graph.microsoft.com/v1.0/users/{user-id-or-email} - ARM订阅列表接口:同第一部分的API,获取用户有权访问的订阅
- Azure DevOps PR详情接口:获取创建者的AD关联信息
- 实现步骤:
- 触发配置:确保流水线设置为PR触发,使用预定义变量
System.PullRequest.PullRequestId获取当前PR ID。 - 获取PR创建者信息(PowerShell示例):
$prId = $(System.PullRequest.PullRequestId) $orgUri = $(System.TeamFoundationCollectionUri) $project = $(System.TeamProject) $accessToken = $(System.AccessToken) $prDetails = Invoke-RestMethod -Uri "$orgUri/$project/_apis/git/repositories/$(Build.Repository.ID)/pullrequests/$prId?api-version=7.1-preview.1" -Headers @{Authorization = "Bearer $accessToken"} $creatorEmail = $prDetails.createdBy.uniqueName Write-Host "PR创建者邮箱:$creatorEmail" - 身份验证与订阅获取(Azure CLI示例):
- task: AzureCLI@2 inputs: azureSubscription: '你的服务连接名称' scriptType: 'bash' inlineScript: | # 获取PR创建者的AD对象ID creator_object_id=$(az ad user show --id "$CREATOR_EMAIL" --query id -o tsv) if [ -z "$creator_object_id" ]; then echo "PR创建者未在Azure AD中找到,终止流水线" exit 1 fi # 获取该用户有权访问的订阅列表 az account list --user $creator_object_id --output json # 添加自定义验证逻辑,比如检查是否包含指定订阅 if ! az account list --user $creator_object_id --query "[?name=='目标订阅名称']" | grep -q "目标订阅名称"; then echo "PR创建者无目标订阅访问权限,终止流水线" exit 1 fi env: CREATOR_EMAIL: $(creatorEmail)
- 触发配置:确保流水线设置为PR触发,使用预定义变量
内容的提问来源于stack exchange,提问作者niko jonas
相关产品推荐
相关产品推荐

