Azure DevOps Services
了解如何使用 OAuth 2.0 对 Azure DevOps REST API 访问的应用程序进行身份验证,而无需用户重复提供凭据。
重要
Microsoft Entra ID OAuth 是新应用程序的建议方法 。 Azure DevOps OAuth 2.0 已弃用,自 2025 年 4 月起不再接受新注册,计划于 2026 年完全弃用。
OAuth 2.0 如何与 Azure DevOps 配合使用
注意
OAuth 2.0 仅适用于 Azure DevOps Services,而不适用于 Azure DevOps Server。 对于本地方案,请使用 客户端库、Windows 身份验证或 个人访问令牌。
Azure DevOps Services 使用 OAuth 2.0 协议 来授权应用程序并为 REST API 调用生成访问令牌。 该过程涉及:
- 应用注册:向 OAuth 提供程序注册应用程序
- 用户授权:用户授予应用访问其数据的权限
- 令牌交换:接收访问令牌以调用 API
- API 访问:将令牌用于经过身份验证的 REST API 请求
- 令牌刷新:刷新过期令牌以维护访问权限
OAuth 实现选项
根据应用程序的需求选择适当的 OAuth 实现:
Microsoft Entra ID OAuth (建议)
Microsoft Entra ID OAuth 为 Azure DevOps 应用程序提供最安全且最未来的身份验证方法。 优点包括:
- 企业集成:与现有 Microsoft Entra ID 基础结构无缝集成
- 增强的安全性:高级安全功能,包括条件访问和多重身份验证
- 未来支持:积极维护和支持的平台
- 统一标识:跨 Microsoft 服务的单一登录体验
入门:按照我们的 Microsoft Entra ID OAuth 指南 获取实现详细信息和迁移指南。
Azure DevOps OAuth (已弃用)
警告
Azure DevOps OAuth 已弃用。 自 2025 年 4 月起不再接受新应用注册,该服务计划在 2026 年完全弃用。 将现有应用程序迁移到 Microsoft Entra ID OAuth。
对于现有的 Azure DevOps OAuth 应用程序:
- 查看 Azure DevOps OAuth 指南 以了解当前实现详细信息
- 在 2026 年之前计划迁移到 Microsoft Entra ID OAuth
- 根据需要管理现有应用授权
小窍门
迁移规划:提前开始规划迁移到 Microsoft Entra ID OAuth。 我们的 迁移指南 提供了平稳过渡的提示和注意事项。
OAuth 范围
范围定义应用程序可以访问的 Azure DevOps 资源。 Microsoft Entra ID OAuth 和 Azure DevOps OAuth 都使用相同的范围定义。
权限范围的关键注意事项
- 最低特权原则:仅请求应用程序所需的最低范围。
- 范围继承:某些范围包括其他范围(例如,
vso.code_manage
包括vso.code_write
)。 - API 覆盖范围:范围允许访问 REST API,并仅选择 Git 终结点(不支持 SOAP API)。
- 用户同意:用户必须为每个请求的范围显式授予权限。
查找所需的权限范围
若要确定应用程序需要的访问权限,请执行以下步骤:
- 查看计划使用的每个终结点的 API 参考文档。
- 在每个 API 页面上查找
scopes
标头。 - 若要避免请求冗余权限,请考虑范围关系。
可用的范围
类别 | Scope | 名称 | 高特权 | 描述 | 继承自 |
---|---|---|---|---|---|
高级安全性 | vso.advsec |
AdvancedSecurity(读取) | 是的 | 授予读取警报、结果实例和分析结果实例的权限。 | |
vso.advsec_write |
AdvancedSecurity(读取和写入) | 是的 | 允许在 sarif 中上传分析结果。 | vso.advsec |
|
vso.advsec_manage |
AdvancedSecurity (读取、写入和管理) | 是的 | 允许在 sarif 中上传分析结果。 | vso.advsec_write |
|
代理池 | vso.agentpools |
代理池(读取) | 允许查看任务、池、队列、代理以及代理当前正在运行或最近完成的作业。 | ||
vso.agentpools_manage |
代理池(读取和管理) | 是的 | 允许管理池、队列和代理。 | vso.agentpools |
|
vso.environment_manage |
环境(读取、管理) | 是的 | 允许管理池、队列、代理和环境。 | vso.agentpools_manage |
|
分析 | vso.analytics |
分析(读取) | 授予查询分析数据的能力。 | ||
审核 | vso.auditlog |
审计日志(读取) | 授予向用户读取审核日志的功能。 | ||
vso.auditstreams_manage |
审计流(读取) | 是的 | 向用户授予管理审核流的能力。 | vso.auditlog |
|
构建 | vso.build |
生成(读取) | 授予访问生成项目(包括生成结果、定义和请求)的能力,以及通过服务挂钩接收有关生成事件的通知的能力。 | vso.hooks_write |
|
vso.build_execute |
生成(读取和执行) | 是的 | 授予访问生成项目(包括生成结果、定义和请求)以及排队生成、更新生成属性的功能,以及通过服务挂钩接收有关生成事件的通知的能力。 | vso.build |
|
代码 | vso.code |
代码(读取) | 允许读取源代码以及有关提交、变更集、分支和其他版本控制项目的元数据。 此外,还可以通过服务挂钩搜索代码并获取有关版本控制事件的通知。 | vso.hooks_write |
|
vso.code_write |
代码(读取和写入) | 是的 | 授予读取、更新和删除源代码、访问有关提交、更改集、分支和其他版本控制项目的元数据的能力。 此外,还授予创建和管理拉取请求和代码评审以及通过服务挂钩接收有关版本控制事件的通知的能力。 | vso.code |
|
vso.code_manage |
代码(读取、写入和管理) | 是的 | 授予读取、更新和删除源代码、访问有关提交、更改集、分支和其他版本控制项目的元数据的能力。 此外,还授予创建和管理代码存储库、创建和管理拉取请求和代码评审以及通过服务挂钩接收有关版本控制事件的通知的能力。 | vso.code_write |
|
vso.code_full |
代码(完整) | 是的 | 允许完全访问源代码、提交元数据、变更集、分支和其他版本控制项目。 此外,还授予创建和管理代码存储库、创建和管理拉取请求和代码评审以及通过服务挂钩接收有关版本控制事件的通知的能力。 还包括对客户端 OM API 的有限支持。 | vso.code_manage |
|
vso.code_status |
代码(状态) | 允许读写提交和拉取请求状态。 | |||
连接服务器 | vso.connected_server |
已连接的服务器 | 允许从内部连接的服务器访问终结点。 | ||
权利 | vso.entitlements |
权利(读取) | 提供对许可权利终结点的只读访问权限,以获取帐户权利。 | ||
vso.memberentitlementmanagement |
MemberEntitlement 管理(读取) | 允许读取用户、其许可证以及他们可以访问的项目和扩展。 | |||
vso.memberentitlementmanagement_write |
成员权利管理(写入) | 是的 | 授予管理用户、其许可证以及可以访问的项目和扩展的能力。 | vso.memberentitlementmanagement |
|
扩展 | vso.extension |
扩展(读取) | 授予读取已安装扩展的能力。 | vso.profile |
|
vso.extension_manage |
扩展(读取和管理) | 是的 | 授予对已安装扩展进行安装、卸载和执行其他管理操作的功能。 | vso.extension |
|
vso.extension.data |
扩展数据(读取) | 授予读取已安装扩展存储的数据(设置和文档)的能力。 | vso.profile |
||
vso.extension.data_write |
扩展数据(读取和写入) | 授予读取和写入已安装扩展存储的数据(设置和文档)的能力。 | vso.extension.data |
||
Github 连接 | vso.githubconnections |
GitHub 连接(读取) | 授予读取 GitHub 连接和 GitHub 存储库数据的能力。 | ||
vso.githubconnections_manage |
GitHub 连接(读取和管理) | 是的 | 授予读取和管理 GitHub 连接和 GitHub 存储库数据的能力 | vso.githubconnections |
|
图表和标识 | vso.graph |
图(读取) | 授予读取用户、群组、范围和群组成员信息的能力。 | ||
vso.graph_manage |
图(管理) | 是的 | 授予读取用户、组、范围和组成员身份信息以及添加用户、组和管理组成员身份的功能。 | vso.graph |
|
vso.identity |
标识(读取) | 允许读取标识和组。 | |||
vso.identity_manage |
标识(管理) | 是的 | 允许读取、写入和管理标识和组。 | vso.identity |
|
计算机组 | vso.machinegroup_manage |
部署组(读取、管理) | 是的 | 提供管理部署组和代理池的功能。 | vso.agentpools_manage |
市场 | vso.gallery |
Marketplace | 授予对公共和专用项目以及发布者的读取访问权限。 | vso.profile |
|
vso.gallery_acquire |
市场(获取) | 授予读取访问权限并允许获取项目。 | vso.gallery |
||
vso.gallery_publish |
市场(发布) | 是的 | 授予读取访问权限以及上传、更新和共享项的能力。 | vso.gallery |
|
vso.gallery_manage |
市场(管理) | 是的 | 授予读取访问权限,并允许发布和管理项目和发布实体。 | vso.gallery_publish |
|
通知 | vso.notification |
通知(读取) | 提供对订阅和事件元数据的读取访问权限,包括可筛选字段值。 | vso.profile |
|
vso.notification_write |
通知(写入) | 提供对订阅的读取和写入访问权限,以及对事件元数据的读取访问权限,包括可筛选字段值。 | vso.notification |
||
vso.notification_manage |
通知(管理) | 提供对订阅的读取、写入和管理访问权限,以及对事件元数据的读取访问权限,包括可筛选字段值。 | vso.notification_write |
||
vso.notification_diagnostics |
通知(诊断) | 提供对通知相关的诊断日志的访问权限,并提供为单个订阅启用诊断的功能。 | vso.notification |
||
打包 | vso.packaging |
打包(读取) | 允许读取源和包。 | vso.profile |
|
vso.packaging_write |
打包(读取和写入) | 是的 | 允许创建和读取源和包。 | vso.packaging |
|
vso.packaging_manage |
打包(读取、写入和管理) | 是的 | 授予创建、读取、更新和删除信息流和包的功能。 | vso.packaging_write |
|
管道资源 | vso.pipelineresources_use |
管道资源(使用) | 是的 | 授予批准管道使用受保护资源的请求的功能:代理池、环境、队列、存储库、安全文件、服务连接和变量组。 | |
vso.pipelineresources_manage |
管道资源(使用和管理) | 是的 | 授予管理受保护资源或管道使用受保护资源的请求的能力:代理池、环境、队列、存储库、安全文件、服务连接和变量组。 | vso.pipelineresources_use |
|
项目和团队 | vso.project |
项目和团队(读取) | 授予读取项目和团队的权限。 | ||
vso.project_write |
项目和团队(读取和写入) | 允许读取和更新项目和团队。 | vso.project |
||
vso.project_manage |
项目和团队(读取、写入和管理) | 是的 | 授予创建、读取、更新和删除项目和团队的能力。 | vso.project_write |
|
发布 | vso.release |
发布(读取) | 授予读取发布制品(包括发布、发布定义和发布环境)的权限。 | vso.profile |
|
vso.release_execute |
发布(读取、写入和执行) | 是的 | 允许读取和更新发布项目(包括发布、发布定义和发布环境),以及对新发布进行排队。 | vso.release |
|
vso.release_manage |
发布(读取、写入、执行和管理) | 是的 | 授予读取、更新和删除发布项目(包括发布、发布定义和发布环境)以及排队和批准新版本的功能。 | vso.release_execute |
|
安全文件 | vso.securefiles_read |
安全文件(读取) | 是的 | 授予读取安全文件的能力。 | |
vso.securefiles_write |
安全文件(读取、创建) | 是的 | 授予读取和创建安全文件的能力。 | vso.securefiles_read |
|
vso.securefiles_manage |
安全文件(读取、创建和管理) | 是的 | 授予读取、创建和管理安全文件的能力。 | vso.securefiles_write |
|
安全性 | vso.security_manage |
安全性(管理) | 是的 | 授予读取、写入和管理安全权限的能力。 | |
服务连接 | vso.serviceendpoint |
服务终结点(读取) | 授予读取服务终结点的能力。 | vso.profile |
|
vso.serviceendpoint_query |
服务终结点(读取和查询) | 授予读取和查询服务终结点的能力。 | vso.serviceendpoint |
||
vso.serviceendpoint_manage |
服务终结点(读取、查询和管理) | 是的 | 授予读取、查询和管理服务终结点的能力。 | vso.serviceendpoint_query |
|
服务挂钩 | vso.hooks |
服务挂钩(读取) | 允许读取服务挂钩订阅和元数据,包括支持的事件、使用者和操作。 (不再公开。 | vso.profile |
|
vso.hooks_write |
服务挂钩(读取和写入) | 授予创建和更新服务挂钩订阅和读取元数据的功能,包括受支持的事件、使用者和操作。 (不再公开。 | vso.hooks |
||
vso.hooks_interact |
服务挂钩(交互) | 允许对通过服务挂钩接收的事件进行交互和执行操作。 (不再公开。 | vso.profile |
||
设置 | vso.settings |
设置(读取) | 允许读取设置。 | ||
vso.settings_write |
设置(读取和写入) | 授予读取和写入设置的权限。 | vso.settings |
||
符号 | vso.symbols |
符号(读取) | 授予读取符号的能力。 | vso.profile |
|
vso.symbols_write |
符号(读取和写入) | 授予读取和写入符号的能力。 | vso.symbols |
||
vso.symbols_manage |
符号(读取、写入和管理) | 授予读取、写入和管理符号的能力。 | vso.symbols_write |
||
任务组 | vso.taskgroups_read |
任务组(读取) | 允许读取任务组。 | ||
vso.taskgroups_write |
任务组(读取、创建) | 允许读取和创建任务组。 | vso.taskgroups_read |
||
vso.taskgroups_manage |
任务组(读取、创建和管理) | 是的 | 授予读取、创建和管理任务组的权限。 | vso.taskgroups_write |
|
团队仪表板 | vso.dashboards |
团队仪表板(读取) | 授予读取团队仪表板信息的能力。 | ||
vso.dashboards_manage |
团队仪表板(管理) | 授予管理团队仪表板信息的能力。 | vso.dashboards |
||
测试管理 | vso.test |
测试管理(读取) | 允许读取测试计划、用例、结果和其他测试管理相关项目。 | vso.profile |
|
vso.test_write |
测试管理(读取和写入) | 授予读取、创建和更新测试计划、事例、结果和其他测试管理相关项目的能力。 | vso.test |
||
线程 | vso.threads_full |
PR 线程 | 允许读取和写入拉取请求评论线程。 | ||
标记 | vso.tokens |
委派授权令牌 | 是的 | 授予向用户管理委派授权令牌的能力。 | |
vso.tokenadministration |
令牌管理 | 是的 | 向组织管理员授予管理现有令牌(查看和撤销)的能力。 | ||
用户配置文件 | vso.profile |
用户资料(读取) | 允许读取个人资料、帐户、集合、项目、团队和其他顶级组织项目。 | ||
vso.profile_write |
用户个人资料(写入) | 允许向个人资料写入内容。 | vso.profile |
||
变量组 | vso.variablegroups_read |
变量组(读取) | 授予读取变量组的能力。 | ||
vso.variablegroups_write |
变量组(读取、创建) | 授予读取和创建变量组的能力。 | vso.variablegroups_read |
||
vso.variablegroups_manage |
变量组(读取、创建和管理) | 是的 | 授予读取、创建和管理变量组的能力。 | vso.variablegroups_write |
|
维基 | vso.wiki |
Wiki(读取) | 授予读取 Wiki、Wiki 网页和 Wiki 附件的功能。 此外,还授予搜索 Wiki 页面的能力。 | ||
vso.wiki_write |
Wiki(读取和写入) | 授予读取、创建和更新 Wiki、Wiki 网页和 Wiki 附件的功能。 | vso.wiki |
||
工作项 | vso.work |
工作项(读取) | 授予读取工作项、查询、版块、区域和迭代路径以及其他工作项跟踪相关元数据的能力。 此外,还授予执行查询、搜索工作项以及通过服务挂钩接收有关工作项事件的通知的能力。 | vso.hooks_write |
|
vso.work_write |
工作项(读取和写入) | 授予读取、创建和更新工作项及查询、更新看板元数据、读取区域和迭代路径以及其他工作项跟踪相关元数据、执行查询的能力,并通过服务挂钩接收有关工作项事件的通知。 | vso.work |
||
vso.work_full |
工作项目(完整) | 授予对工作项、查询、积压工作、计划和工作项跟踪元数据的完全访问权限。 此外,还可以通过服务挂钩接收有关工作项事件的通知。 | vso.work_write |
||
用户冒充 | user_impersonation |
用户模拟 | 是的 | 对 Visual Studio Team Services REST API 具有完全访问权限。 请谨慎请求和/或同意此范围,因为它非常强大! |
常见问题
问:是否可以将 OAuth 与移动应用程序配合使用?
答: 不是。 Azure DevOps Services 仅支持 Web 服务器流(授权代码流),这需要安全地存储应用机密。 移动应用程序无法安全地存储机密,从而使 OAuth 不适用于移动方案。
移动应用的替代方法:使用 个人访问令牌 进行移动应用程序身份验证。
问:OAuth 是否适用于所有 Azure DevOps API?
答:OAuth 支持 REST API,并仅选择 Git 终结点。 SOAP API 不支持 OAuth 身份验证。
问:如何从 Azure DevOps OAuth 迁移到 Microsoft Entra ID OAuth?
答:遵循 我们的Microsoft Entra ID OAuth 迁移指南,其中包括:
- 分步迁移说明
- 代码示例和最佳做法
- 弃用的时间线考虑因素
问:2026 年之后现有 Azure DevOps OAuth 应用会发生什么情况?
答:现有 Azure DevOps OAuth 应用在 2026 年完全弃用时停止工作。 请在截止日期前规划迁移到 Microsoft Entra ID OAuth。
后续步骤
选择实现路径:
对于新应用程序:
对于现有的 Azure DevOps OAuth 应用:
对于需要立即支持的现有应用: