使用 Azure SDK for .NET 向 Azure 資源驗證 Azure 裝載的應用程式
若使用 Azure App Service、Azure 虛擬機器或 Azure 容器執行個體等服務將應用程式裝載於 Azure 中,向 Azure 資源驗證應用程式時,建議使用受控識別。
受控識別會為您的應用程式提供身分識別,使其能夠連線至其他 Azure 資源,而無須使用秘密金鑰或其他應用程式秘密。 在內部,Azure 知道您應用程式的身分識別,及其能夠連線至哪些資源。 Azure 會使用這項資訊自動取得應用程式的 Microsoft Entra 權杖,使其能夠連線至其他 Azure 資源,且讓您完全無須管理任何應用程式秘密。
受控識別類型
受控身分識別有兩種:
- 系統指派 - 此類型的受控識別由 Azure 資源提供,並直接繫結至 Azure 資源。 當您在 Azure 資源上啟用受控識別時,您會取得系統為該資源指派的受控識別。 系統指派的受控識別會繫結至與其相關聯之 Azure 資源的生命週期。 因此,當刪除資源時,Azure 會自動為您刪除身分識別。 您只需要為裝載程式碼的 Azure 資源啟用受控識別即可,因此,這可說是最容易使用的受控識別類型。
- 使用者指派 - 您也可以將受控識別建立為獨立的 Azure 資源。 您的解決方案有多個工作負載執行於多個 Azure 資源上,且這些資源全都需要共用相同的身分識別和相同的權限時,最常用到此身分識別。 例如,如果您的解決方案有元件執行於多個 App Service 和虛擬機器執行個體上,而這些執行個體全都需要存取相同的 Azure 資源集,則在這些資源間建立並使用由使用者指派的受控識別,將是有效的做法。
本文將說明為應用程式啟用及使用系統指派的受控識別所需的步驟。 如果您需要使用由使用者指派的受控識別,請參閱管理使用者指派的受控識別一文,以了解如何建立使用者指派的受控識別。
1 - 在裝載應用程式的 Azure 資源中啟用受控識別
第一個步驟是在裝載應用程式的 Azure 資源上啟用受控識別。 例如,如果您使用 Azure App Service 來裝載 .NET 應用程式,則必須為裝載應用程式的 App Service Web 應用程式啟用受控識別。 如果您使用虛擬機器來裝載您的應用程式,則應讓 VM 能夠使用受控識別。
您可以使用 Azure 入口網站或 Azure CLI,讓受控識別用於 Azure 資源。
2 - 將角色指派給受控識別
接下來,判斷應用程式需要哪些角色 (權限),並將受控識別指派給 Azure 中的那些角色。 受控識別可以在資源、資源群組或訂閱範圍獲派角色。 此範例會顯示如何在資源群組範圍內指派角色,因為多數應用程式都會將所有 Azure 資源劃分在單一資源群組中。
3 - 在應用程式中實作 DefaultAzureCredential
DefaultAzureCredential 是向 Microsoft Entra 驗證的固定已排序機制序列。 每個驗證機制都是源自 TokenCredential 類別的類別,稱為「認證」。 在執行階段中,DefaultAzureCredential
會嘗試使用第一個認證進行驗證。 如果該認證無法取得存取權杖,則會嘗試序列中的下一個認證,以此類推,直到成功取得存取權杖為止。 因此,您的應用程式可以在相異環境中使用不同的認證,而不需要撰寫環境特定程式碼。
DefaultAzureCredential
尋找認證的順序和位置,可在 DefaultAzureCredential (英文) 中找到。
若要使用 DefaultAzureCredential
,請新增 Azure.Identity,並選擇性地將 Microsoft.Extensions.Azure 套件新增至您的應用程式:
在您選擇的終端機中,瀏覽至應用程式專案目錄,然後執行下列命令:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
使用來自各種 Azure SDK 用戶端程式庫的特殊用戶端類別以存取 Azure 服務。 這些類別和您自訂的服務都應註冊,使其可在應用程式中透過相依性插入來存取。 在 Program.cs
中,完成下列步驟以註冊用戶端類別和 DefaultAzureCredential
:
- 透過
using
指示詞包含Azure.Identity
和Microsoft.Extensions.Azure
命名空間。 - 使用對應的
Add
前置詞擴充方法來註冊 Azure 服務用戶端。 - 將
DefaultAzureCredential
的執行個體傳遞至UseCredential
方法。
例如:
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
UseCredential
的替代方法是直接將 DefaultAzureCredential
具現化:
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
當上述程式碼在本機開發工作站上執行時,它會在環境變數中尋找應用程式服務主體,或在本機安裝的開發工具 (例如 Visual Studio) 中尋找一組開發人員認證。 在本機開發期間,您可以使用任一方法向 Azure 資源驗證應用程式。
部署至 Azure 時,同一組程式碼也可向其他 Azure 資源驗證您的應用程式。 DefaultAzureCredential
可擷取環境設定與受控識別設定,以便自動向其他服務進行驗證。