設定多個 Azure 應用程式和服務之間的無密碼連線

應用程式通常同時需要多個 Azure 服務之間的安全連線。 例如,企業 Azure App Service 執行個體可能連線到數個不同的儲存體帳戶、Azure SQL 資料庫執行個體、服務匯流排等等。

受控識別是 Azure 資源之間安全無密碼連線的建議驗證選項。 開發人員不需要手動追蹤和管理受控識別的許多不同秘密,因為大部分的工作都由 Azure 在內部處理。 本教學課程將探討如何使用受控識別和 Azure 身分識別用戶端程式庫來管理多個服務之間的連線。

比較受控識別的類型

Azure 提供下列類型的受控識別:

  • 系統指派的受控識別直接繫結到單一 Azure 資源。 當您在服務上啟用系統指派的受控識別時,Azure 會建立連結的身分識別,並在內部處理該身分識別的系統管理工作。 刪除 Azure 資源時,也會刪除身分識別。
  • 使用者指派的受控識別是由系統管理員所建立的獨立身分識別,可以與一或多個 Azure 資源相關聯。 身分識別的生命週期與這些資源無關。

您可以在身分識別最佳做法建議中深入了解最佳做法,以及使用系統指派身分識別與使用者指派身分識別的時機。

探索 DefaultAzureCredential

通常是透過用戶端程式庫 Azure.Identity 中的 DefaultAzureCredential 類別,在您的應用程式程式碼中實作受控識別。 DefaultAzureCredential 支援多個驗證方法,並在執行階段自動判斷應該使用何者。 您可以在 DefaultAzureCredential 概觀中深入了解此方法。

將 Azure 裝載的應用程式連線至多個 Azure 服務

您接獲任務使用無密碼連線,將現有的應用程式連線到多個 Azure 服務和資料庫。 應用程式是裝載於 Azure App Service 上的 ASP.NET Core Web API,但下列步驟也適用於其他 Azure 裝載環境,例如 Azure Spring Apps、虛擬機器、容器應用程式和 AKS。

本教學課程適用於下列架構,但稍微變更一下設定,也可以運用在其他許多案例。

Diagram showing the user assigned identity relationships.

下列步驟示範如何設定應用程式,以使用系統指派的受控識別和本機開發帳戶來連線到多個 Azure 服務。

建立系統指派的受控識別

  1. 在 Azure 入口網站中,瀏覽至您想要連線到其他服務的託管應用程式。

  2. 在服務概觀頁面上,選取 [身分識別]

  3. 將 [狀態] 設定切換為 [開啟],為服務啟用系統指派的受控識別。

    Screenshot showing how to assign a system assigned managed identity.

將角色指派給每個連線服務的受控識別

  1. 針對您想要授與身分識別存取的儲存體帳戶,瀏覽其概觀頁面。

  2. 從儲存體帳戶導覽中選取 [存取控制 (IAM)]

  3. 選擇 [+新增],然後選擇 [新增角色指派]

    Screenshot showing how to assign a system-assigned identity.

  4. 在 [角色] 搜尋方塊中,搜尋「儲存體 Blob 資料參與者」,以授權對 Blob 資料執行讀取和寫入作業。 根據您的使用案例,您可以指派任何適合的角色。 從清單中選取 [儲存體 Blob 資料參與者],然後選擇 [下一步]

  5. 在 [新增角色指派] 畫面上,針對 [存取權指派對象為] 選項,選取 [受控識別]。 然後選擇 [+選取成員]

  6. 在飛出視窗中,輸入應用程式服務的名稱來搜尋您建立的受控識別。 選取系統指派的身分識別,然後選擇 [選取] 以關閉飛出視窗功能表。

    Screenshot showing how to select a system-assigned identity.

  7. 選取幾次 [下一步],直到能夠選取 [檢閱 + 指派] 來完成角色指派為止。

  8. 針對您想要連線的其他服務重複此程序。

本機開發考量

您也可以像指派角色給受控識別一樣,將角色指派給使用者帳戶,讓本機開發可以存取 Azure 資源。

  1. 儲存體 Blob 資料參與者角色指派給受控識別之後,在 [存取權指派對象為] 下,這次選取 [使用者、群組或服務主體]。 選擇 [+ 選取成員] 再次開啟飛出視窗功能表。

  2. 搜尋並選取您想要依電子郵件地址或名稱授與存取權的 user@domain 帳戶或 Microsoft Entra 安全性群組。 這應該是您用來登入本機開發工具的相同帳戶,例如 Visual Studio 或 Azure CLI。

注意

如果您在小組內與多個開發人員合作,您也可以將這些角色指派給 Microsoft Entra 安全性群組。 然後,您可以將需要存取權在本機開發應用程式的任何開發人員放入該群組內。

實作應用程式程式碼

在專案內,新增 NuGet 套件 Azure.Identity 的參考。 此程式庫包含實作 DefaultAzureCredential 的所有必要實體。 您也可以新增與應用程式相關的其他任何 Azure 程式庫。 此範例中新增 Azure.Storage.BlobsAzure.KeyVault.Keys 套件,以連線到 Blob 儲存體和 Key Vault。

dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.KeyVault.Keys

Program.cs 檔案頂端,新增下列 using 陳述式:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Security.KeyVault.Keys;

在專案程式碼的 Program.cs 檔案中,針對應用程式將連線的必要服務,建立執行個體。 下列範例使用對應的 SDK 類別來連線到 Blob 儲存體和服務匯流排。

var blobServiceClient = new BlobServiceClient(
    new Uri("https://<your-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential(credOptions));

var serviceBusClient = new ServiceBusClient("<your-namespace>", new DefaultAzureCredential());
var sender = serviceBusClient.CreateSender("producttracking");

當此應用程式程式碼在本機執行時,DefaultAzureCredential 會在認證鏈結中搜尋第一個可用的認證。 如果 Managed_Identity_Client_ID 在本機為 null,則會自動使用來自本機 Azure CLI 或 Visual Studio 登入的認證。 您可以在 Azure 身分識別程式庫概觀中深入了解此程序。

當應用程式部署至 Azure 時,DefaultAzureCredential 會自動從 App Service 環境擷取 Managed_Identity_Client_ID 變數。 當受控識別與您的應用程式相關聯時,該值就會變成可用。

此概觀程序可確保應用程式在本機和 Azure 中安全地執行,完全不需要變更程式碼。

使用多個受控識別來連線多個應用程式

雖然上述範例中的應用程式全都共用相同的服務存取需求,但實際環境通常有更細微的差別。 假設有多個應用程式都連線到相同的儲存體帳戶,但其中兩個應用程式還會存取不同的服務或資料庫。

Diagram showing multiple user-assigned managed identities.

若要在程式碼中進行此設定,請確定應用程式註冊不同的服務,以連線到每個儲存體帳戶或資料庫。 設定 DefaultAzureCredential 時,請務必提取每個服務的正確受控識別用戶端識別碼。 下列程式碼範例設定下列服務連線:

  • 使用共用使用者指派的受控識別連到不同儲存體帳戶的兩個連線
  • 使用第二個共用使用者指派的受控識別來連線至 Azure Cosmos DB 和 Azure SQL 服務
// Get the first user-assigned managed identity ID to connect to shared storage
const clientIdStorage = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage");

// First blob storage client that using a managed identity
BlobServiceClient blobServiceClient = new BlobServiceClient(
    new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });

// Second blob storage client that using a managed identity
BlobServiceClient blobServiceClient2 = new BlobServiceClient(
    new Uri("https://<contract-storage-account>.blob.core.windows.net"),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDstorage
    });


// Get the second user-assigned managed identity ID to connect to shared databases
var clientIDdatabases = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases");

// Create an Azure Cosmos DB client
CosmosClient client = new CosmosClient(
    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
    new DefaultAzureCredential()
    {
        ManagedIdentityClientId = clientIDdatabases
    });

// Open a connection to Azure SQL using a managed identity
string ConnectionString1 = @"Server=<azure-sql-hostname>.database.windows.net; User Id=ClientIDOfTheManagedIdentity; Authentication=Active Directory Default; Database=<database-name>";

using (SqlConnection conn = new SqlConnection(ConnectionString1))
{
    conn.Open();
}

使用者指派的受控識別及系統指派的受控識別也可以同時與一個資源產生關聯。 當所有應用程式都需要存取相同的共用服務,但其中一個應用程式還特別依賴另一個服務時,這就很有用。 使用系統指派的身分識別也可確保刪除應用程式時,一併刪除繫結至該特定應用程式的身分識別,這有助於保持環境乾淨。

Diagram showing user-assigned and system-assigned managed identities.

身分識別最佳做法建議中更深入探索這幾種情況。

下一步

在本教學課程中,您已了解如何將應用程式移轉為無密碼連線。 您可以閱讀下列資源,以更深入探索本文所討論的概念: