連線從您的應用程式到資源,而不需要處理認證

具有受控識別支援的 Azure 資源一律提供選項來指定受控識別,以連線到支援 Microsoft Entra 驗證的 Azure 資源。 受控識別支援使得開發人員不需要在程式碼中管理認證。 使用支援的 Azure 資源時,受控識別是建議的驗證選項。 閱讀受控識別的概觀

此頁面示範如何設定 App Service,使其可以連線到 Azure 金鑰保存庫、Azure 儲存體和 Microsoft SQL Server。 相同的原則可用於任何支援受控識別的 Azure 資源,以及連線到支援 Microsoft Entra 驗證的資源。

程式碼範例會使用 Azure 身分識別用戶端程式庫,這是建議的方法,因為它會自動為您處理許多步驟,包括取得連線中使用的存取權杖。

受控識別可以連線到哪些資源?

受控識別可以連線到任何支援 Microsoft Entra 驗證的資源。 一般而言,資源不需要特殊支援,可讓受控識別連線到該資源。

某些資源不支援 Microsoft Entra 驗證,或其用戶端程式庫不支援使用權杖進行驗證。 請繼續閱讀,以瞭解如何使用受控識別安全地存取認證,而不需要將認證儲存在程式碼或應用程式組態中。

建立受控識別

受控識別有兩種類型:系統指派和使用者指派。 系統指派的身分識別會直接連結至單一 Azure 資源。 刪除 Azure 資源時,身分識別也是如此。 使用者指派的受控識別可以與多個 Azure 資源相關聯,且其生命週期與這些資源無關。

本文將說明如何建立及設定使用者指派的受控識別,這在大部分情況下 都是 建議的。 如果您使用的來源資源不支援使用者指派的受控識別,則您應該參考該資源提供者的檔,以瞭解如何將它設定為具有系統指派的受控識別。

建立使用者指派的受控識別

注意

您需要「受控識別參與者」之類的角色,才能建立新的使用者指派受控識別。

  1. 從入口網站頂端的搜尋列中搜尋「受控識別」,然後選取相符的結果。

Screenshot of searching for managed identities in the portal.

  1. 選取 [建立] 按鈕。

Screenshot showing a managed identity create button in the portal.

  1. 選取 [訂用帳戶] 和 [資源群組],然後輸入受控識別的名稱。

Screenshot showing a managed identity create screen in the portal.

  1. 選取 [檢閱 + 建立] 以執行驗證測試,然後選取 [建立] 按鈕。

  2. 建立身分識別之後,就會顯示確認畫面。

Screenshot showing a managed identity confirmation screen after creation in the portal.

您現在有可與 Azure 來源資源相關聯的身分識別。 深入瞭解如何管理使用者指派的受控識別。

設定來源資源以使用使用者指派的受控識別

請遵循下列步驟,將您的 Azure 資源設定為透過入口網站擁有受控識別。 請參閱特定資源類型的檔,以瞭解如何使用命令列介面、PowerShell 或 ARM 範本來設定資源的身分識別。

注意

您需要「寫入」許可權,才能將 Azure 資源設定為具有系統指派的身分識別。 您需要「受控識別操作員」之類的角色,才能將使用者指派的身分識別與 Azure 資源產生關聯。

  1. 使用入口網站頂端的搜尋列找出資源

Screenshot showing a resource being searched for in the portal.

  1. 在導覽中選取 [身分識別] 連結

Screenshot showing the link to the identity screen for a resource in the portal.

  1. 選取 [使用者指派] 索引標籤

  2. 選取 [新增] 按鈕

Screenshot showing a user-assigned identity screen in the portal.

  1. 選取您稍早建立的使用者指派身分識別,然後選取 [新增]

Screenshot showing a user-assigned identity being selected in the portal.

  1. 身分識別將會與資源相關聯,清單將會更新。

Screenshot showing a user-assigned identity has been associated with the Azure resource in the portal.

您的來源資源現在具有使用者指派的身分識別,可用來連線到目標資源。

將許可權新增至身分識別

注意

您需要目標資源的「使用者存取管理員istrator」或「擁有者」之類的角色,才能新增角色指派。 請確定您授與應用程式執行所需的最低許可權。

現在您的 App Service 具有受控識別,您必須為身分識別提供正確的許可權。 當您使用此身分識別來與Azure 儲存體互動時,您將使用 Azure 角色型存取控制 (RBAC) 系統

  1. 找出您想要使用入口網站頂端的搜尋列連線的資源
  2. 選取左側導覽中的 [存取控制 (IAM)] 連結。

Screenshot showing a resource summary screen in the portal.

  1. 選取畫面頂端附近的 [新增] 按鈕,然後選取 [新增角色指派]。

Screenshot showing the add role assignment navigation in the portal.

  1. 將會顯示 [角色] 清單。 您可以選取 [檢視] 連結,以查看角色擁有的特定許可權。 選取您要授與身分識別的角色,然後選取 [下一步] 按鈕。

Screenshot showing a role being selected in the portal.

  1. 系統會提示您選取應授與角色的人員。 選取 [受控識別] 選項,然後選取 [新增成員] 連結。

Screenshot showing the identity type being selected in the portal.

  1. 內容窗格會出現在右側,您可以依受控識別的類型進行搜尋。 從 [受控識別] 選項中選取 [使用者指派的受控識別]。

Screenshot showing managed identity being selected in the portal.

  1. 選取您稍早建立的身分識別和 [選取] 按鈕。 內容窗格將會關閉,並將身分識別新增至清單。

Screenshot showing an identity being added to a resource in the portal.

  1. 選取 [檢閱 + 指派] 按鈕以檢視角色指派的摘要,然後再次確認。
  2. 選取 [角色指派] 選項,並顯示資源的角色指派清單。

Screenshot showing the role assignment has been added in the portal.

您的受控識別現在具有存取 Azure 目標資源的正確許可權。 深入瞭解 Azure 角色型存取控制

在您的程式碼中使用受控識別

您的 App Service 現在具有具有許可權的受控識別。 您可以在程式碼中使用受控識別來與目標資源互動,而不是將認證儲存在程式碼中。

建議的方法是針對您慣用的程式設計語言使用 Azure 身分識別程式庫。 支援的語言包括 .NET JAVA、 JavaScript Python Go C++ 。 程式庫會為您取得存取權杖,讓您輕鬆連線到目標資源。

在您的開發環境中使用 Azure 身分識別程式庫

除了 C++ 程式庫之外,Azure 身分識別程式庫支援 DefaultAzureCredential 類型。 DefaultAzureCredential 會自動嘗試透過多個機制進行驗證,包括環境變數或互動式登入。 您可以使用自己的認證,在開發環境中使用認證類型。 其也可以利用受控識別,在 Azure 實際執行環境中使用。 當您部署應用程式時,不需要變更任何程式碼。

如果您使用使用者指派的受控識別,則也應該藉由將身分識別的用戶端識別碼傳遞為參數,明確指定您想要驗證的使用者指派受控識別。 您可以流覽至入口網站中的身分識別來擷取用戶端識別碼。

Screenshot showing the client ID for the managed identity in the portal.

深入瞭解下列 Azure 身分識別程式庫:

存取 Azure 儲存體 中的 Blob

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

存取儲存在 Azure 金鑰保存庫 中的秘密

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

存取 Azure SQL 資料庫

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

連線程式庫中不支援 Microsoft Entra 識別碼或權杖型驗證的資源

有些 Azure 資源尚未支援 Microsoft Entra 驗證,或其用戶端程式庫不支援使用權杖進行驗證。 這些資源通常是開放原始碼技術,其預期連接字串中有使用者名稱和密碼或存取金鑰。

若要避免將認證儲存在程式碼或應用程式組態中,您可以將認證儲存為 Azure 金鑰保存庫中的秘密。 使用上面顯示的範例,您可以使用受控識別從 Azure KeyVault 擷取秘密,並將認證傳遞至您的連接字串。 此方法表示不需要直接在程式碼或環境中處理認證。

如果您正在直接處理權杖的指導方針

在某些情況下,您可能想要手動取得受控識別的權杖,而不是使用內建方法來連線到目標資源。 這些案例不包含您使用的程式設計語言用戶端程式庫,或您要連線的目標資源,或連線到未在 Azure 上執行的資源。 手動取得權杖時,我們提供下列指導方針:

快取您取得的權杖

為了達到效能和可靠性,建議您應用程式快取本機記憶體中的權杖,或如果您想要將權杖儲存至磁片,請加以加密。 由於受控識別權杖的有效期限為 24 小時,因此定期要求新權杖沒有任何好處,因為快取權杖會從權杖發行端點傳回。 如果您超過要求限制,您將會受到速率限制,並收到 HTTP 429 錯誤。

當您取得權杖時,您可以將權杖快取設定為在產生權杖時傳回的 (或對等屬性) 5 分鐘 expires_on 到期。

權杖檢查

您的應用程式不應該依賴權杖的內容。 權杖的內容僅適用于正在存取的物件(目標資源),而不是要求權杖的用戶端。 權杖內容未來可能會變更或加密。

不要公開或移動權杖

權杖應該被視為認證。 請勿將其公開給使用者或其他服務;例如,記錄/監視解決方案。 它們不應該從使用它們的來源資源移動,而不是針對目標資源進行驗證。

下一步