共用方式為


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

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

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

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

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

受控識別可以連線到支援 Microsoft Entra 驗證的任何資源。 一般而言,資源不需要特殊支援,即可允許受控識別連線至其中。

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

建立受控識別

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

本文將說明如何建立和設定使用者指派的受控識別,這是針對大部分案例建議的動作。 如果您使用的來源資源不支援使用者指派的受控識別,則您應該參考該資源提供者的文件,了解如何將其設定為具有系統指派的受控識別。

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

注意

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

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

在入口網站中搜尋受控識別的螢幕擷取畫面。

  1. 選取 [建立] 按鈕。

螢幕擷取畫面顯示入口網站中的受控識別建立按鈕。

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

螢幕擷取畫面顯示入口網站中的受控識別建立畫面。

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

  2. 建立身分識別之後,確認畫面將會出現。

入口網站中建立之後顯示受控識別確認畫面的螢幕擷取畫面。

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

將來源資源設定為使用一個使用者指派的受控識別

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

注意

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

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

螢幕擷取畫面照顯示入口網站中搜尋的資源。

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

螢幕擷取畫面顯示入口網站中資源的身分識別連結畫面。

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

  2. 選取 [新增] 按鈕

螢幕擷取畫面顯示入口網站中使用者指派的身分識別畫面。

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

螢幕擷取畫面顯示在入口網站中選取使用者指派的身分識別。

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

螢幕擷取畫面顯示入口網站中使用者指派的身分識別已與 Azure 資源相關聯。

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

將權限新增至身分識別

注意

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

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

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

螢幕擷取畫面顯示入口網站中的資源摘要畫面。

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

螢幕擷取畫面顯示入口網站中的 [新增角色指派] 導覽。

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

螢幕擷取畫面顯示在入口網站中選取角色。

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

螢幕擷取畫面顯示在入口網站中選取身分識別類型。

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

螢幕擷取畫面顯示在入口網站中選取受控識別。

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

螢幕擷取畫面顯示在入口網站中將身分識別新增至資源。

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

螢幕擷取畫面顯示在入口網站中已新增角色指派。

您的受控識別現在具有存取 Azure 目標資源的正確權限。 深入閱讀 Azure 角色型存取控制

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

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

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

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

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

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

螢幕擷取畫面顯示入口網站中受控識別的用戶端識別碼。

深入閱讀下列 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 Key Vault 中儲存的秘密

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 Database

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 ID 或權杖型驗證的資源

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

若要避免將認證儲存在您的程式碼或應用程式設定中,您可以將認證當作祕密儲存在 Azure Key Vault 中。 使用上面顯示的範例,您可以使用受控識別從 Azure Key Vault 擷取秘密,並將認證傳遞至連接字串。 此方法表示不需要直接在您的程式碼或環境中處理認證。

如果您要直接處理權杖時的指導方針

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

快取您取得的權杖

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

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

權杖檢查

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

請不要公開或移動權杖

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

下一步