使用个人访问令牌

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

可以将个人访问令牌 (PAT) 用作备用密码,以便对Azure DevOps进行身份验证。 本文介绍如何为Azure DevOps创建、使用、修改和撤销 PAT。

关于 PAT

个人访问令牌包含Azure DevOps的安全凭据。 PAT 可识别你、可访问的组织以及访问范围。 因此,它们与密码一样重要,因此你应该以相同的方式对待它们。

如果你在 Microsoft 工具中工作,则 Microsoft 帐户 (MSA) 或 Azure Active Directory (Azure AD) 是一种可接受的且受支持良好的方法。 但是,如果你使用的是不支持 Microsoft 或 Azure AD 帐户的第三方工具,或者不想向该工具提供主凭据,请使用 PAT 来限制风险。

可以通过以下方法之一创建和管理 PAT:

若要为非 Microsoft 工具设置 PAT,请使用 Git 凭据管理器 或手动创建它们。 建议查看身份验证 指南 ,帮助你选择正确的身份验证机制。 对于需要不太可靠的解决方案的较小项目,PAT 是一个简单的替代方法。 除非用户使用的是凭据管理器,否则他们必须每次输入凭据。

创建 PAT

备注

从 Web 门户看到的图像可能与本文中看到的图像不同。 这些差异源于对Azure DevOps或已启用预览功能的更新。 我们启用了 “新建帐户经理”页面 功能。 除非明确提及,否则可用的基本功能保持不变。

  1. 登录到组织 (https://dev.azure.com/{yourorganization}) 。

  2. 在主页中,打开用户设置 ,然后选择 “个人访问令牌”。

    Select Personal Access Tokens

  3. 选择“+ New Token”。

    Select New Token to create

  4. 为令牌命名,选择要在其中使用令牌的组织,然后将令牌设置为在设置天数后自动过期。

    Enter basic token information

  5. 选择此令牌的范围以授权特定任务

    例如,若要创建令牌,使生成和发布代理能够向Azure DevOps Services进行身份验证,请将令牌的范围限制为代理池, (读取&管理) 。 若要读取审核日志事件并管理和删除流,请选择“ 读取审核日志”,然后选择“ 创建”。

    Select scopes for your PAT

    注意

    你可能会受到限制,无法创建全范围 PAT。 如果是这样,Azure AD 中的Azure DevOps管理员已启用一个策略,该策略将限制为特定的自定义自定义范围集。 有关详细信息,请参阅 使用策略管理 PAT/限制创建全范围 PAT。 对于自定义的 PAT,访问组件治理 API vso.governance所需的范围在 UI 中不可选择。

  6. 完成后,请确保复制令牌并将其存储在安全位置。 对于安全性,不会再次显示它。

    Copy the token to your clipboard

警告

像密码一样对待和使用 PAT,并将其保留为机密。

  1. () https://{server}:8080/tfs/ 登录到 Web 门户。

  2. 在主页中,打开个人资料。 转到安全详细信息。

    Home page, open your profile, go to Security

  3. 创建个人访问令牌。

    Add a personal access token

  4. 为令牌命名。 为令牌选择生存期。

    如果有多个组织,还可以选择要在其中使用令牌的组织。

    Name your token, select a lifespan. If using Azure DevOps Services, select an account for your token

  5. 选择此令牌的范围以授权特定任务

    例如,若要创建令牌以启用 生成和发布代理 进行身份验证,请将令牌的范围限制为 代理池, (读取、管理)

  6. 完成后,请确保 复制令牌。 对于安全性,不会再次显示它。 将此令牌用作密码。 选择“关闭” 。

    Use a token as the password for your Git tools or apps

在 Azure DevOps 中,在用户凭据所需的任意位置使用 PAT。

重要

对于由Azure Active Directory支持的组织,你有 90 天时间使用新的 PAT 登录,否则被视为非活动状态。 有关详细信息,请参阅 条件访问的用户登录频率

通知

用户在 PAT 生存期内收到两条通知 - 一个在创建期间收到,另一个在过期前 7 天收到。

创建 PAT 后,会收到类似于以下示例的通知。 此通知确认已将 PAT 添加到组织。

PAT created notification

下图显示了 PAT 到期前的七天通知示例。

PAT near expiration notification

意外通知

如果收到意外的 PAT 通知,管理员或工具可能代表你创建了 PAT。 请参阅以下示例。

  • 通过 git.exe 连接到 Azure DevOps Git 存储库时。 它创建一个令牌,其显示名称类似于“git: https://MyOrganization.visualstudio.com/ on MyMachine”。
  • 当你或管理员设置Azure 应用服务 Web 应用部署时,它会创建一个带有显示名称的令牌,如“服务挂钩::Azure 应用服务::部署 Web 应用”。
  • 当你或管理员将 Web 负载测试设置为管道的一部分时,它会创建一个带有显示名称(如“WebAppLoadTestCDIntToken”)的令牌。
  • 设置 Microsoft Teams Integration Messaging Extension 时,它会创建一个带有显示名称(如“Microsoft Teams集成”)的令牌。

警告

如果你认为 PAT 存在错误,我们建议 撤销 PAT。 然后,更改密码。 作为 Azure AD 用户,请与管理员联系,查看组织是否从未知源或位置使用。 另请参阅有关意外签入 PAT 到公共GitHub存储库的常见问题解答。

使用 PAT

PAT 是你的标识,在使用它时表示你,就像密码一样。

Git

Git 交互需要用户名,该用户名可以是空字符串以外的任何内容。 PAT 用作密码。 此外,必须对用户名和 PAT 进行 Base64 编码才能用于 HTTP 基本身份验证。

在 PowerShell 中,输入以下代码。

$MyPat = ':PatStringFromWebUI'
$UserName = ':UserNameToUseWithToken'
$B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("$UserName:$MyPat"))
git -c http.extraHeader="Authorization: Basic $B64Pat" clone https://dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName

若要使令牌更安全,请使用凭据管理器,因此无需每次输入凭据。 建议 使用 Git 凭据管理器。 需要 git for Windows

$MyPat = 'yourPAT'
$B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$MyPat"))
git -c http.extraHeader="Authorization: Basic $B64Pat" clone https://dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName

现有存储库

对于现有存储库,如果已使用用户名添加源,请先运行以下命令。

git remote remove origin

否则,请运行以下命令。

git remote add origin https://<PAT>@<company_machineName>.visualstudio.com:/<path-to-git-repo> path to git repo = <project name>/_git/<repo_name> git push -u origin --all

在代码中使用 PAT

可以在代码中使用 PAT,但请注意以下警告。

警告

我们的一些公共 API 当前与 PAT 范围无关,因此只能与“全范围”PAT 一起使用。 因此,限制创建全范围 PAT 可能会阻止某些工作流。 我们正在努力识别和记录受影响的 API,并最终将它们与适当的范围相关联。 目前,可以使用允许列表取消阻止这些工作流。

如果要通过 HTTP 标头提供 PAT,请先将其转换为 Base64 字符串。 以下示例演示如何使用 C# 转换为 Base64。


Authorization: Basic BASE64_USERNAME_PAT_STRING

然后,可以采用以下格式将生成的字符串作为 HTTP 标头提供。

以下示例使用 C# 中的 HttpClient 类

public static async void GetBuilds()
{
    try
    {
        var personalaccesstoken = "PATFROMWEB";

        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(
                new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    System.Text.ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", "", personalaccesstoken))));

            using (HttpResponseMessage response = client.GetAsync(
                        "https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.0").Result)
            {
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

提示

使用变量时,请在字符串的开头添加一个 $ ,如以下示例所示。

public static async void GetBuilds()
{
   try
  {
      var personalaccesstoken = "PATFROMWEB";

      using (HttpClient client = new HttpClient())
       {
           client.DefaultRequestHeaders.Accept.Add(
              new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

           client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
               Convert.ToBase64String(
                   System.Text.ASCIIEncoding.ASCII.GetBytes(
                       string.Format("{0}:{1}", "", personalaccesstoken))));

          using (HttpResponseMessage response = client.GetAsync(
                       $"https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.0").Result)
           {
               response.EnsureSuccessStatusCode();
               string responseBody = await response.Content.ReadAsStringAsync();
               Console.WriteLine(responseBody);
           }
       }
   }
   catch (Exception ex)
   {
       Console.WriteLine(ex.ToString());
   }
}

代码正常工作时,最好从基本身份验证切换到 OAuth

有关如何使用 PAT 的详细信息和示例,请参阅以下文章:

如果为 TFS 启用 IIS 基本身份验证,则 PAT 无效。 有关详细信息,请参阅 将 IIS 基本身份验证与本地 TFS 配合使用

修改 PAT

可以重新生成或扩展 PAT,并修改其 范围。 重新生成后,不再授权上一个 PAT。

  1. 在主页中,打开用户设置 ,然后选择 “配置文件”。

    My profile Team Services, Preview page, modify a PAT.

  2. 在“安全性”下,选择 “个人访问令牌”。 选择要修改的令牌,然后选择 “编辑”。

    Select Edit to modify PAT

  3. 编辑令牌名称、它适用于的组织、令牌过期或与令牌关联的访问范围,然后选择“ 保存”。

    Modify and Save PAT

撤销 PAT

出于各种原因,可以随时撤销 PAT。

  1. 在主页中,打开用户设置 ,然后选择 “配置文件”。

    My profile Team Services, Preview page, revoke a PAT.

  2. 在“安全性”下,选择 “个人访问令牌”。 选择要撤消访问权限的令牌,然后选择“ 撤销”。

    Revoke a token or all tokens

  3. 在确认对话框中选择 “撤销 ”。

    Confirm revoke

常见问题解答

问:是否有办法通过 REST API 续订 PAT?

答:是的,可以使用 PAT 生命周期管理 API 续订、管理和创建 PAT。 有关详细信息,请参阅 使用 REST API 管理 PAT常见问题解答

问:是否可以对所有Azure DevOps REST API 使用基本身份验证?

答:否。 可以将基本身份验证用于大多数Azure DevOps REST API,但组织和配置文件仅支持 OAuth。 有关详细信息,请参阅 使用 REST API 管理 PAT

问:如果在GitHub上意外将 PAT 签入公共存储库,会发生什么情况?

答:Azure DevOps扫描在GitHub上签入公共存储库的 PAT。 当我们找到泄露的令牌时,我们会立即向令牌所有者发送详细的电子邮件通知,并将事件记录到Azure DevOps组织的审核日志。 我们鼓励受影响的用户通过 轮换或撤销泄漏的 PAT 来立即缓解。

有一个用于管理泄露的 PAT 的策略! 有关详细信息,请参阅 自动撤销泄露的 PAT