共用方式為


在 Azure DevOps 中使用服務主體和受控識別

Azure DevOps 服務

服務主體和受控識別可為 Azure DevOps 自動化工作流程提供安全且可調整的驗證。 這些 Microsoft Entra 身分識別類型提供傳統個人存取權杖 (PAT) 的增強安全性。 它們使用自動憑證管理、較短的令牌生命週期和企業級存取控制。

服務主體和受控識別的優點

增強安全性

  • 短期權杖:Microsoft Entra 權杖每小時到期一次,相較於 PAT (最多可以持續一年) ,這可降低暴露風險。
  • 自動輪替:受控識別會自動處理認證輪替。
  • 無儲存的密碼:無需將長期憑證儲存在程式碼或組態中。

營運卓越性

  • 集中式管理:透過 Microsoft Entra ID 原則和 Azure DevOps 許可權控制存取。
  • 審計功能: 通過全面的日誌記錄跟踪身份驗證和訪問模式。
  • 高效擴展: 支持企業自動化場景,無需個人用戶依賴。

新式驗證

  • 基於標準:使用 OAuth 2.0 和 OpenID Connect 協定。
  • 多重要素驗證支援:繼承組織安全性原則。
  • 條件式存取:根據內容套用進階安全性原則。

了解服務主體和受控識別

服務主體

服務主體 是代表租用戶內應用程式的 Microsoft Entra 物件。 他們會定義應用程式可以執行的動作、可以存取哪些資源,以及誰可以使用它。 當您在 Microsoft entra ID 中註冊應用程式時,會自動建立服務主體,並提供安全的方式讓應用程式驗證和存取資源。

主要特性

  • 是透過 Microsoft Entra ID 中的應用程式註冊來建立。
  • 支援多租用戶案例。
  • 需要明確的認證管理 (憑證或用戶端密碼)。
  • 非常適合需要跨不同環境進行身份驗證的應用程序。

受管理的身分識別

受控識別 是 Azure 自動管理的特殊服務主體類型。 他們透過提供在 Azure 資源的 Microsoft Entra ID 中自動管理的身份,消除開發人員管理認證的需求。

受控識別的類型

系統指派的受控識別:

  • 自動建立並系結至特定 Azure 資源。
  • 由 Azure 管理的生命週期 (刪除資源時刪除)。
  • 與 Azure 資源的一對一關聯性。
  • 最適合部署在單一 Azure 資源上的應用程式。

使用者指派的受控識別:

  • 建立為獨立 Azure 資源。
  • 可以指派給多個 Azure 資源。
  • 獨立於相關資源管理的生命週期。
  • 最適合在多個資源上執行或需要共用身分識別的應用程式。

何時使用每種類型:

  • 服務主體:跨雲端部署、持續整合和持續傳遞 (CI/CD) 管線、Azure 外部的應用程式。
  • 系統指派的受控識別:單一 Azure 資源應用程式 (Azure Functions、Azure App Service)。
  • 使用者指派的受控識別:多資源應用程式、共用身分識別案例。

實作指南

請遵循下列步驟來實作 Azure DevOps 驗證的服務帳號或管理身份。 如需完整的程式碼範例,請參閱我們的 範例應用程式

步驟 1:建立身分識別

根據您的部署案例選擇適當的身分識別類型。

選項 A:建立服務主體(應用程式註冊)

服務主體適用於 CI/CD 管線、跨雲端案例,以及需要彈性部署選項的應用程式。

  1. Microsoft Entra 系統管理中心註冊應用程式。

  2. 移至 [應用程式註冊>] [新增註冊]。

  3. 設定應用程式:

    • 名稱:為您的應用程式使用描述性名稱。
    • 帳戶類型:選取適當的租用戶支援。
    • 重新導向 URI:在服務對服務案例中保留空白。
  4. 建立驗證認證:

    • 建議:上傳憑證以增強安全性。
    • 替代方法:建立用戶端密碼 (需要定期輪換)。

這很重要

當您註冊應用程式時,Azure 會同時建立應用程式對象和服務主體物件。 當您將服務主體新增至 Azure DevOps 時,請使用 服務主體的物件識別碼 (位於 [ 企業應用程式 ] 窗格) ,而不是應用程式的物件識別碼。

如需詳細資訊,請參閱下列文章:

選項 B:建立受控識別

受控識別可為 Azure 裝載的應用程式提供最簡單的驗證體驗。

針對系統指派的受控識別:

  1. 移至您的 Azure 資源,例如 App Service 或 Azure Functions 應用程式。
  2. 請前往身分識別>系統指派
  3. 將狀態切換為 開啟
  4. 選取 儲存 以 儲存設定。

針對使用者指派的受控識別:

  1. 在 Azure 入口網站中建立受控識別。
  2. 移至 建立資源>受控識別
  3. 設定基本設定並建立資源。
  4. 視需要指派給資源。

如需詳細資訊,請參閱下列文章:

步驟 2:將身分識別新增至 Azure DevOps

在 Microsoft Entra ID 中建立身分識別之後,請將它新增至 Azure DevOps 組織,以授與資源的存取權。

先決條件

  • 專案集合系統管理員角色。
  • 邀請原則 允許小組系統管理員新增使用者時,專案系統管理員或小組系統管理員角色。

新增身分識別

若要透過 Azure DevOps 入口網站新增身分識別:

  1. 移至 組織設定>使用者

  2. 選取 [ 新增使用者]。

  3. 輸入服務主體或受管理的身分的顯示名稱。

  4. 選取適當的存取層級和專案存取權。

  5. 傳送邀請。

    螢幕擷取畫面,顯示使用者中樞中的服務主體和受控識別。

以程式設計方式新增身分:

使用 ServicePrincipalEntitlements REST API 將程式自動化。

其他考慮因素:

  • 尋找正確的 ID: 在 Microsoft Entra 系統管理中心的 [ 企業應用程式 ] 窗格上使用服務主體的物件識別碼,而不是應用程式註冊的物件識別碼。
  • 租戶限制: 您只能從 Azure DevOps 組織所連線的相同租用戶新增身分識別。 如需跨租使用者案例,請參閱 常見問題因應措施

步驟 3:設定許可權

在 Azure DevOps 中設定服務主體或受控識別的細微許可權。 不同於其他 Azure 服務,Azure DevOps 會使用自己的許可權模型,而不是Microsoft Entra 應用程式許可權。

權限選項:

  • 直接指派:直接將權限指派給身分識別。
  • 群組成員資格:新增至 Azure DevOps 或 Microsoft Entra 安全性群組。
  • 存取層級:指派適當的授權層級 (基本、基本 + Test Plans 或 Visual Studio 訂閱者) 。

最佳做法:

  • 套用最低權限:僅授予所需的最低權限。
  • 使用群組:透過群組管理權限,方便維護。
  • 定期審查:定期審核權限。

權限管理選項:

  • Azure DevOps 入口網站:選取 [組織設定>許可權]。
  • REST API:使用 服務主體圖形 API 進行程式設計管理。

這很重要

Azure DevOps 與 Microsoft Entra 許可權: Azure DevOps 不會使用 Microsoft Entra ID 應用程式許可權。 所有存取控制都是透過 Azure DevOps 許可權系統來管理,這允許細微的專案和資源層級許可權。

步驟 4:取得 Microsoft Entra ID 令牌

取得存取令牌,以使用 Azure DevOps API 和服務來驗證您的應用程式。

針對服務主體

使用用戶端認證流程:

POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id={client-id}
&scope=https://app.vssps.visualstudio.com/.default
&client_secret={client-secret}
&grant_type=client_credentials

使用憑證驗證 (建議):

using Microsoft.Identity.Client;

var app = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithCertificate(certificate)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

var result = await app
    .AcquireTokenForClient(new[] { "https://app.vssps.visualstudio.com/.default" })
    .ExecuteAsync();

string accessToken = result.AccessToken;

針對受管理識別

從 Azure 資源:

using Azure.Identity;
using Azure.Core;

var credential = new ManagedIdentityCredential();
var tokenRequest = new TokenRequestContext(new[] { "https://app.vssps.visualstudio.com/.default" });
var token = await credential.GetTokenAsync(tokenRequest);

string accessToken = token.Token;

使用 Azure 執行個體中繼資料服務:

GET http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://app.vssps.visualstudio.com/
Metadata: true

適用於臨機操作的 Azure CLI

針對一次性作業或測試,請使用 Azure CLI:

# For service principal
az login --service-principal --username {client-id} --password {client-secret} --tenant {tenant-id}
az account get-access-token --resource https://app.vssps.visualstudio.com/

# For managed identity (from Azure resource)
az login --identity
az account get-access-token --resource https://app.vssps.visualstudio.com/

如需詳細資訊,請參閱 取得 Microsoft Entra 權杖

步驟 5:使用 Azure DevOps 令牌

使用您取得的令牌來驗證 REST API 呼叫和其他 Azure DevOps 作業。

進行經過驗證的 API 呼叫:

using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", accessToken);

var response = await client.GetAsync(
    "https://dev.azure.com/{organization}/_apis/projects?api-version=7.1");

影片範例

常見的整合案例

如需完整的程式碼範例,請參閱我們的 範例應用程式

管理考量

服務主體和受控識別與使用者帳戶相比,具有不同的管理特性。

Licensing

  • 每個身分都需要其加入的每個組織中的授權。
  • 多組織計費 不適用於服務主體。
  • 群組型授權規則不會自動套用。 您必須直接指派授權。

身分識別管理

  • 不會使用電子郵件地址,因此不會透過電子郵件收到邀請。
  • 顯示名稱或虛擬人偶不會在 Azure DevOps 中修改。
  • 顯示名稱繼承自 Microsoft Entra ID。

群組成員資格

  • 可以新增至 Microsoft Entra 群組和 Azure DevOps 群組。
  • 有技術限制,可防止在 Microsoft Entra 群組成員清單中顯示 (僅限 UI 限制)。
  • 仍然可以從其所屬的 Microsoft Entra 群組繼承許可權。

具體化

  • 必須明確新增至組織 (沒有像使用者一樣的自動具體化)。
  • 必要,因為服務主體無法以互動方式登入。

用戶帳戶的主要差異

與一般使用者相比,服務主體和受控識別有特定的限制。

能力

  • ✅ 產生 API 存取的 Microsoft Entra 權杖。
  • ✅ 使用適當的許可權存取 Azure DevOps 資源。
  • ✅ 加入安全群組和團隊。
  • ❌ 建立 PAT 或 Secure Shell 金鑰。
  • ❌ 以互動方式登入或透過 Web UI 存取。
  • ❌ 建立或擁有組織。
  • ❌ 支援 Azure DevOps OAuth 流程。

帳單管理

  • 在每個組織中算作個別授權。 (沒有多組織折扣。
  • 必須直接指派存取層級。 (群組規則不會自動套用。

常見問題

Q. 為什麼我應該使用服務主體或受控識別,而不是 PAT?

A。 服務主體和受控識別比 PAT 提供顯著的安全性優勢。

安全優勢:

  • 較短的生命週期:與 PAT 相比,Microsoft Entra 令牌每小時到期一次,PAT 最多可持續一年。
  • 自動輪替:受控識別會自動輪替認證。
  • 沒有共享秘密:消除了儲存或意外暴露長期代幣的風險。
  • 集中式控制:透過具有企業安全性原則的 Microsoft Entra ID 進行管理。

營運優勢:

  • 稽核追蹤:完整記錄驗證和存取模式。
  • 條件式存取:根據位置、裝置和風險因素套用原則。
  • 無服務帳戶:消除對個別使用者帳戶的依賴以實現自動化。

如需移轉範例,請參閱 使用 Microsoft Entra 令牌取代 PAT

Q. 服務主體和受控識別的速率限制為何?

A。 服務主體和受控識別的 速率限制 與使用者相同。

Q. 使用此功能會花費更多嗎?

A。 服務主體和受控識別會根據存取層級,以使用者一樣定價。 主要區別在於:

  • 無多組織計費折扣:每個身分識別都算作每個組織中的個別授權。
  • 授權指派:必須直接指派存取層級。 (群組規則不會自動套用。
  • 相同的定價層:適用基本、基本 + 測試計劃和 Visual Studio 訂閱者費率。

Q. 我可以將不同租使用者的受控識別新增至我的組織嗎?

A。 您只能直接從組織的連線租用戶新增身分識別。 針對跨租用戶案例,請使用此因應措施。

若要設定跨租用戶受控識別:

  1. 在資源租用戶中建立使用者指派的受控識別。
  2. 將它指派給 Azure 資源,例如虛擬機器或 Functions 應用程式)。
  3. 建立金鑰保存庫並產生憑證 (非 PEM 格式)。
  4. 授與具有 [取得 ] 和 [列出 ] 秘密許可權的金鑰保存庫受控識別存取權。
  5. 以 CER 格式下載憑證 (僅限公開金鑰)。
  6. 在目標租用戶中註冊應用程式。
  7. 將憑證上傳至應用程式註冊。
  8. 將服務主體新增至 Azure DevOps 組織。
  9. 使用金鑰保存庫中的憑證來設定驗證。
// Example: Acquire token using managed identity certificate
public static async Task<string> GetSecret(string keyVaultName, string secretName)
{
    var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net");
    var client = new SecretClient(keyVaultUri, new ManagedIdentityCredential());
    var keyVaultSecret = await client.GetSecretAsync(secretName);
    return keyVaultSecret.Value.Value;
}

private static async Task<AuthenticationResult> GetAppRegistrationAADAccessToken(
    string applicationClientID, string appTenantId)
{
    byte[] privateKeyBytes = Convert.FromBase64String(await GetSecret(keyVaultName, secretName));
    var certificate = new X509Certificate2(privateKeyBytes, (string)null, X509KeyStorageFlags.MachineKeySet);

    var app = ConfidentialClientApplicationBuilder.Create(applicationClientID)
        .WithCertificate(certificate)
        .WithAuthority(new Uri($"https://login.microsoftonline.com/{appTenantId}"))
        .Build();

    var result = await app.AcquireTokenForClient(
        new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" })
        .ExecuteAsync();

    return result;
}

這很重要

定期輪換憑證,以取得安全性最佳實務。

常見錯誤和解決方案

名稱或標識碼的 Git 存放庫不存在,或您沒有許可權

溶液: 請確定服務主體至少具有基本授權。 利害關係人授權不提供存放庫存取權。

無法建立具有物件標識碼的服務主體

溶液: 確認您使用的是 [ 企業應用程式 ] 窗格中的服務主體物件識別碼,而不是應用程式註冊的物件識別碼。

若要尋找正確的 ID:

  1. 移至 Microsoft Entra 系統管理中心>企業應用程式
  2. 搜尋您的應用程式名稱。
  3. 使用 「企業應用程式 」窗格上的物件識別碼。

拒絕存取:需要新增使用者的權限

可能的原因及解決方案:

  • 角色不足:必須是專案集合系統管理員 (PCA) 或已啟用邀請許可權的專案或小組系統管理員。
  • 原則限制:檢查是否已啟用 [允許小組和專案系統管理員邀請新使用者] 原則。
  • 授權指派:專案系統管理員無法在邀請期間指派授權。 請聯絡 PCA 以取得授權變更。

Azure DevOps 圖表清單 API 會傳回空白清單

溶液: 用於 continuationToken 逐一查看所有頁面。 服務主體可能會因為 API 分頁行為而出現在稍後的頁面上。

TF401444:需要登入的錯誤

溶液: 請確定服務主體已正確新增至具有必要許可權的組織。 此錯誤表示組織中無法辨識身分識別。