共用方式為


使用系統指派的受控識別向 Azure 資源驗證 Azure 裝載的 .NET 應用程式

向其他 Azure 資源驗證 Azure 裝載應用程式的建議方法是使用 受控識別。 此方法 支援大部分的 Azure 服務,包括裝載在 Azure App Service、Azure Container Apps 和 Azure 虛擬機上的應用程式。 在 驗證概觀 頁面上瞭解更多不同的驗證技術和方法。 在接下來的各節中,您將瞭解:

  • 基本受控識別概念
  • 如何為您的應用程式建立系統指派的受控識別
  • 如何將角色指派給系統指派的受管理身份
  • 如何從應用程式程式代碼使用系統指派的受控識別進行驗證

基本受控識別概念

受控識別可讓您的應用程式安全地連線到其他 Azure 資源,而不需要使用秘密金鑰或其他應用程式秘密。 在內部,Azure 會追蹤身分識別,以及允許其連線的資源。 Azure 會使用這項資訊自動取得應用程式Microsoft Entra 令牌,以允許它連線到其他 Azure 資源。

設定載入的應用程式時,需要考慮兩種類型的受控識別:

  • 系統指派 受控身分識別是在 Azure 資源上直接啟用的,並與其生命周期緊密相連。 刪除資源時,Azure 會自動為您刪除身分識別。 系統指派的身分識別提供使用受控識別的極簡方法。
  • 使用者指派的 管理的身分會建立為獨立的 Azure 資源,並提供更強的彈性與功能。 其適用於涉及多個需要共用相同身分識別和許可權之 Azure 資源的解決方案。 例如,如果多個虛擬機需要存取同一組 Azure 資源,則使用者指派的受控識別可提供重複使用性和優化管理。

提示

若要深入瞭解如何選取和管理系統指派的受控識別和使用者指派的受控識別,請參閱 受控識別最佳做法建議 一文。

前面的各節說明為 Azure 裝載的應用程式啟用和使用系統指派的受控識別的步驟。 如果您需要使用使用者指派的受控識別,請流覽 用戶指派的受控識別 文章以取得詳細資訊。

在 Azure 裝載資源上啟用系統指派的受控識別

若要開始使用系統指派的受控識別搭配您的應用程式,請在裝載應用程式的 Azure 資源上啟用身分識別,例如 Azure App Service、Azure Container App 或 Azure 虛擬機。

您可以使用 Azure 入口網站或 Azure CLI,為 Azure 資源啟用系統指派的受控識別。

  1. 在 Azure 入口網站中,瀏覽至裝載應用程式程式代碼的資源,例如 Azure App Service 或 Azure Container App 實例。

  2. 從資源的 [概觀] 頁面中,展開 [[設定],然後從導覽中選取 [身分識別]。

  3. 在 [身份] 頁面上,將 [狀態] 滑桿切換到 開啟

  4. 選取 [儲存] 以套用變更

    顯示如何在容器應用程式上啟用系統指派受控識別的螢幕快照。

將角色指派給管理的身分識別

接下來,判斷您的應用程式需要哪些角色,並將這些角色指派給受控識別。 您可以在下列範圍將角色指派給受控識別:

  • 資源:指派的角色僅適用於該特定資源。
  • 資源群組:指派的角色會套用至資源群組中包含的所有資源。
  • 訂用帳戶:指派的角色會套用至訂用帳戶中包含的所有資源。

下列範例示範如何在資源群組範圍指派角色,因為許多應用程式都會使用單一資源群組來管理其所有相關的 Azure 資源。

  1. 流覽至資源群組的 [概觀] 頁面,其中包含具有系統指派受控識別的應用程式。

  2. 請選取左側導覽列中的 存取控制 (IAM)

  3. 在 [訪問控制 (IAM)] 頁面上,選取頂端功能表上的 [+ 新增],然後選擇 [新增角色指派] 前往 [新增角色指派] 頁面。

    顯示如何存取身分識別角色指派頁面的螢幕快照。

  4. [新增角色指派] 頁面會顯示多步驟的索引標籤式工作流程,以將角色指派給身分。 在 [初始 角色] 索引標籤上,使用頂端的搜尋方塊來找出您要指派給身分識別的角色。

  5. 從結果中選取角色,然後選擇 下一步 以移至 成員 標籤頁。

  6. 針對 [[指派存取權給] 選項,選取 [受控識別]。

  7. 針對 [成員] 選項,選取 [+ 選取成員] 以開啟 [選取受控識別] 面板。

  8. 在 [選取受控識別] 面板上,使用 [訂閱] 和 [受控識別] 下拉式選單來篩選相關識別的搜尋結果。 使用 [] 選取 [] 搜尋方塊,找出您為裝載應用程式的 Azure 資源啟用的系統身分識別。

    顯示受控識別指派程序的螢幕快照。

  9. 選取身分,然後在面板底部選擇[選取]以繼續。

  10. 請在頁面底部點選 ,然後選擇 [檢閱 + 指派]。

  11. 在最後一個 [檢閱 + 指派] 索引標籤上,選取 [檢閱 + 指派],以完成工作流程。

從您的應用程式向 Azure 服務進行驗證

Azure 身分識別連結庫 提供各種 認證—實作 TokenCredential,以支援不同的案例和Microsoft Entra 驗證流程。 由於在本機執行時無法使用受控身分,後續步驟會說明在不同情境下應該使用哪種認證:

  • 本機開發環境本機開發期間僅,請使用 稱為 defaultAzureCredential 的類別,以取得有意見、預先設定的認證鏈結。 DefaultAzureCredential 會從本機工具或 IDE 探索使用者認證,例如 Azure CLI 或 Visual Studio。 它也提供重試的彈性和便利性、回應等候時間,以及支援多個驗證選項。 若要深入瞭解,請瀏覽在本機開發期間驗證 Azure 服務的 驗證 文章。
  • Azure 裝載的應用程式:當您的應用程式在 Azure 中執行時,請使用 ManagedIdentityCredential 安全地探索為應用程式設定的受控識別。 指定此準確類型的認證可防止意外地選用其他可用的認證。

實作程序代碼

新增 Azure.Identity 套件。 在 ASP.NET Core 專案中,也安裝 Microsoft.Extensions.Azure 套件:

在您選擇的終端機中,瀏覽至應用程式項目目錄,然後執行下列命令:

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 這些類別和您自己的自定義服務應該註冊為相依性插入,以便在整個應用程式中使用它們。 在 Program.cs中,完成下列步驟來設定用戶端類別以進行相依性插入和令牌型驗證:

  1. 透過 Azure.Identity 指令來包含 Microsoft.Extensions.Azureusing 命名空間。
  2. 使用對應的 Add前置擴充方法註冊 Azure 服務用戶端。
  3. 將適當的 TokenCredential 實例傳遞至 UseCredential 方法:
    • 當您的應用程式在本機執行時,請使用 DefaultAzureCredential
    • 當您的應用程式在 Azure 中執行時,請使用 ManagedIdentityCredential
builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    TokenCredential credential = null;

    if (builder.Environment.IsProduction())
    {
        // Managed identity token credential discovered when running in Azure environments
        credential = new ManagedIdentityCredential();
    }
    else
    {
        // Running locally on dev machine - DO NOT use in production or outside of local dev
        credential = new DefaultAzureCredential();
    }

    clientBuilder.UseCredential(credential);
});

UseCredential 方法的替代方法是直接將認證提供給服務用戶端:

TokenCredential credential = null;

if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
{
    // Managed identity token credential discovered when running in Azure environments
    credential = new ManagedIdentityCredential();
}
else
{
    // Running locally on dev machine - DO NOT use in production or outside of local dev
    credential = new DefaultAzureCredential();
}

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"), credential));

上述程式代碼的行為會根據執行所在的環境而有所不同:

  • 在您的本機開發工作站上,DefaultAzureCredential 在應用程式服務主體的環境變數中,或在Visual Studio等本機安裝的開發人員工具中尋找一組開發人員認證。
  • 部署至 Azure 時,ManagedIdentityCredential 探索您的受控識別組態,以自動向其他服務進行驗證。