使用Azure AD服务主体实现无代理发布管道调用Azure DevOps API的认证问题
问题解答
微软是否支持用服务主体认证Azure DevOps API?
支持,但你选的服务连接类型不对。Azure Resource Manager服务连接是用来访问Azure云资源(比如VM、存储)的,和Azure DevOps API的认证逻辑不兼容。要认证Azure DevOps API,得用Azure Active Directory类型的服务连接,基于AAD服务主体授权。
错误信息翻译
azure devops {"error":{"code":"MissingSubscription","message":"请求缺少订阅或有效的租户级资源提供程序。"}} 异常信息:
正确的实现步骤
- 在Azure AD中注册服务主体:
- 登录Azure门户,进入「Azure Active Directory」→「应用注册」→「新建注册」。
- 记下客户端ID(即你的Service Principal ID)、客户端密钥,以及租户ID。
- 给服务主体分配Azure DevOps权限:
- 在Azure AD的应用注册页面,进入「API权限」→「添加权限」→ 搜索并选择「Azure DevOps」。
- 勾选你需要的权限(比如
Build.ReadWrite.All、Release.ReadWrite.All),然后完成管理员同意(需AAD管理员操作)。
- 在Azure DevOps中创建正确的服务连接:
- 进入项目设置→「服务连接」→「新建服务连接」,选择「Azure Active Directory」类型。
- 填入租户ID、客户端ID、客户端密钥,命名后保存。
- 在无代理管道中调用API:
- 用PowerShell或Azure CLI获取访问令牌(Azure DevOps的固定资源ID是
499b84ac-1321-427f-aa17-267ca6975798):$token = (Get-AzAccessToken -ResourceUrl "499b84ac-1321-427f-aa17-267ca6975798" -ServicePrincipal).Token - 带上令牌调用API:
$headers = @{ "Authorization" = "Bearer $token" "Content-Type" = "application/json" } Invoke-RestMethod -Uri "https://dev.azure.com/myorg/_apis/pipelines?api-version=7.1-preview.1" -Headers $headers
- 用PowerShell或Azure CLI获取访问令牌(Azure DevOps的固定资源ID是
失败原因分析
你用了Azure Resource Manager服务连接,它的认证逻辑默认要求关联Azure订阅,但Azure DevOps API不需要订阅信息,所以触发了MissingSubscription错误。换用Azure AD类型的服务连接就能解决这个问题。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

