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 管線、跨雲端案例,以及需要彈性部署選項的應用程式。
在 Microsoft Entra 系統管理中心註冊應用程式。
移至 [應用程式註冊>] [新增註冊]。
設定應用程式:
- 名稱:為您的應用程式使用描述性名稱。
- 帳戶類型:選取適當的租用戶支援。
- 重新導向 URI:在服務對服務案例中保留空白。
建立驗證認證:
- 建議:上傳憑證以增強安全性。
- 替代方法:建立用戶端密碼 (需要定期輪換)。
這很重要
當您註冊應用程式時,Azure 會同時建立應用程式對象和服務主體物件。 當您將服務主體新增至 Azure DevOps 時,請使用 服務主體的物件識別碼 (位於 [ 企業應用程式 ] 窗格) ,而不是應用程式的物件識別碼。
如需詳細資訊,請參閱下列文章:
選項 B:建立受控識別
受控識別可為 Azure 裝載的應用程式提供最簡單的驗證體驗。
針對系統指派的受控識別:
- 移至您的 Azure 資源,例如 App Service 或 Azure Functions 應用程式。
- 請前往身分識別>系統指派。
- 將狀態切換為 開啟。
- 選取 儲存 以 儲存設定。
針對使用者指派的受控識別:
- 在 Azure 入口網站中建立受控識別。
- 移至 建立資源>受控識別。
- 設定基本設定並建立資源。
- 視需要指派給資源。
如需詳細資訊,請參閱下列文章:
步驟 2:將身分識別新增至 Azure DevOps
在 Microsoft Entra ID 中建立身分識別之後,請將它新增至 Azure DevOps 組織,以授與資源的存取權。
先決條件
- 專案集合系統管理員角色。
- 當 邀請原則 允許小組系統管理員新增使用者時,專案系統管理員或小組系統管理員角色。
新增身分識別
若要透過 Azure DevOps 入口網站新增身分識別:
移至 組織設定>使用者。
選取 [ 新增使用者]。
輸入服務主體或受管理的身分的顯示名稱。
選取適當的存取層級和專案存取權。
傳送邀請。
以程式設計方式新增身分:
使用 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");
影片範例
常見的整合案例
- NuGet 摘要:與 NuGet.exe 或 dotnet CLI 連線。
- Marketplace 發佈: 透過命令列發佈擴充功能。
- Azure Pipelines:建立受控識別所支援的 服務連線 。
- Git 作業: 使用 Git 認證管理員複製存放庫。
如需完整的程式碼範例,請參閱我們的 範例應用程式。
管理考量
服務主體和受控識別與使用者帳戶相比,具有不同的管理特性。
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。 您只能直接從組織的連線租用戶新增身分識別。 針對跨租用戶案例,請使用此因應措施。
若要設定跨租用戶受控識別:
- 在資源租用戶中建立使用者指派的受控識別。
- 將它指派給 Azure 資源,例如虛擬機器或 Functions 應用程式)。
- 建立金鑰保存庫並產生憑證 (非 PEM 格式)。
- 授與具有 [取得 ] 和 [列出 ] 秘密許可權的金鑰保存庫受控識別存取權。
- 以 CER 格式下載憑證 (僅限公開金鑰)。
- 在目標租用戶中註冊應用程式。
- 將憑證上傳至應用程式註冊。
- 將服務主體新增至 Azure DevOps 組織。
- 使用金鑰保存庫中的憑證來設定驗證。
// 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:
- 移至 Microsoft Entra 系統管理中心>企業應用程式。
- 搜尋您的應用程式名稱。
- 使用 「企業應用程式 」窗格上的物件識別碼。
拒絕存取:需要新增使用者的權限
可能的原因及解決方案:
- 角色不足:必須是專案集合系統管理員 (PCA) 或已啟用邀請許可權的專案或小組系統管理員。
- 原則限制:檢查是否已啟用 [允許小組和專案系統管理員邀請新使用者] 原則。
- 授權指派:專案系統管理員無法在邀請期間指派授權。 請聯絡 PCA 以取得授權變更。
Azure DevOps 圖表清單 API 會傳回空白清單
溶液: 用於 continuationToken 逐一查看所有頁面。 服務主體可能會因為 API 分頁行為而出現在稍後的頁面上。
TF401444:需要登入的錯誤
溶液: 請確定服務主體已正確新增至具有必要許可權的組織。 此錯誤表示組織中無法辨識身分識別。