使用 Azure 身分識別連結庫概觀向 Azure 服務驗證 .NET 應用程式
當應用程式需要存取 Azure 資源時,應用程式必須向 Azure 進行驗證。 這適用於所有應用程式,無論是部署至 Azure、內部部署,還是在本機開發人員工作站上。 本文說明使用 Azure SDK 用戶端連結庫時,向 Azure 驗證應用程式的建議方法。
建議的應用程式驗證方法
建議應用程式在向 Azure 資源進行驗證時,使用令牌型驗證,而不是連接字串。 Azure 身分識別連結庫 提供支援令牌型驗證的類別,並允許應用程式順暢地向 Azure 資源進行驗證,無論應用程式是在本機開發中、部署至 Azure 或部署至內部部署伺服器。
應用程式應該用來向 Azure 資源驗證的特定令牌型驗證類型取決於應用程式執行的位置,如下圖所示:
當應用程式為:
- 在開發期間於本機執行,應用程式可以使用應用程式服務主體進行本機開發,或使用開發人員的 Azure 認證向 Azure 進行驗證。 在本機開發過程中的 驗證階段,將更詳細地討論每個選項。
- 裝載於 Azure上,應用程式應該使用受控識別向 Azure 資源進行驗證。 更詳細地討論此選項,請參見伺服器環境中的 驗證。
- 裝載和部署內部部署,應用程式應該使用應用程式服務主體向 Azure 資源進行驗證。 更詳細地討論此選項,請參見伺服器環境中的 驗證。
DefaultAzureCredential
Azure 身分識別連結庫所提供的 DefaultAzureCredential 類別可讓應用程式根據執行所在的環境使用不同的驗證方法。 這可讓應用程式從本機開發升級至測試環境到生產環境,而不需要變更程序代碼。 您可以為每個環境設定適當的驗證方法,DefaultAzureCredential
會自動偵測並使用該驗證方法。 建議使用 DefaultAzureCredential
來自動處理條件邏輯或功能標誌,以便在不同環境中採用不同的驗證方法,而不是使用手動編寫的程式碼。
關於使用 DefaultAzureCredential
的詳細資料,請參閱 在應用程式中使用 DefaultAzureCredential
。
令牌型驗證的優點
相較於使用連接字串進行驗證,令牌型驗證具有以下優勢:
- 下面所述的令牌型驗證方法可讓您在 Azure 資源上建立應用程式所需的特定許可權。 這符合 的最低許可權原則。 相反地,連接字串會授與 Azure 資源的完整許可權。
- 具有連接字串的任何人或任何應用程式都可以連線到 Azure 資源,令牌型驗證方法會將資源的存取範圍限定為只存取資源的應用程式。
- 在管理識別的情況下,不需要儲存任何應用程式機密。 這可讓應用程式更安全,因為沒有可能遭到入侵的連接字串或應用程式秘密。
- Azure.Identity 套件會為您取得和管理Microsoft Entra 令牌。 這讓使用令牌型驗證變得像使用連接字串一樣容易。
連接字串的使用應僅限於初始概念證明應用程式或開發原型,而無法存取生產或敏感數據。 否則,向 Azure 資源驗證時,Azure 身分識別連結庫中提供的令牌型驗證類別應該一律優先使用。
伺服器環境中的驗證
在伺服器環境中裝載時,每個應用程式都應該為每個執行應用程式的環境指派唯一 應用程式身分識別。 在 Azure 中,應用程式身分識別是由 服務主體來表示,這是一種特殊類型的 安全性主體,用來識別及驗證 Azure 的應用程式。 應用程式要使用的服務主體類型取決於您的應用程式執行位置。
驗證方法 | 描述 |
---|---|
裝載在 Azure 中的應用程式 | 載入在 Azure 中的應用程式應該使用 受控識別服務主體。 受控識別的設計目的是代表裝載在 Azure 中的應用程式身分識別,且只能與 Azure 託管應用程式搭配使用。 例如,裝載在 Azure App Service 中的 .NET Web 應用程式會指派受控識別。 指派給應用程式的受控識別接著會用來向其他 Azure 服務驗證應用程式。 |
裝載於 Azure 外部的應用程式 (例如,內部部署應用程式) |
載入於 Azure 外部的應用程式(例如內部部署應用程式)需要連線到 Azure 服務的應用程式,應使用 應用程式服務主體。 應用程式服務主體代表 Azure 中應用程式的身分識別,並透過應用程式註冊程式建立。 例如,假設裝載於內部部署的 .NET Web 應用程式會使用 Azure Blob 記憶體。 您將使用應用程式註冊程式為應用程式建立應用程式服務主體。 AZURE_CLIENT_ID 、AZURE_TENANT_ID 和 AZURE_CLIENT_SECRET 全都會儲存為應用程式在運行時間讀取的環境變數,並允許應用程式使用應用程式服務主體向 Azure 進行驗證。 |
本機開發期間的驗證
當應用程式在本機開發期間於開發人員的工作站上執行時,它仍必須向應用程式使用的任何 Azure 服務進行驗證。 在本機開發期間向 Azure 驗證應用程式的兩個主要策略如下:
驗證方法 | 描述 |
---|---|
為本地開發期間創建專用的應用程式服務主體物件 | 在此方法中,使用應用程式註冊流程設置專用的 應用程式服務主體 物件,以便在本機開發期間使用。 服務主體的身分識別接著會儲存為環境變數,以在本機開發中執行時由應用程式存取。 此方法可讓您將應用程式所需的特定資源許可權指派給開發人員在本機開發期間所使用的服務主體物件。 這可確保應用程式只能存取它所需的特定資源,並復寫應用程式在生產環境中將擁有的許可權。 這種方法的缺點是,需要為每個在應用程式上運作的開發人員建立個別的服務主體物件。 |
在本機開發期間,使用開發人員的認證向 Azure 驗證應用程式 | 在此方法中,開發人員必須從 Visual Studio、適用於 VS Code 的 Azure 工具擴充功能、Azure CLI 或其本機工作站上的 Azure PowerShell 登入 Azure。 然後,應用程式可以從認證存放區存取開發人員的認證,並使用這些認證從應用程式存取 Azure 資源。 此方法的優點是更容易設定,因為開發人員只需要從Visual Studio、VS Code或 Azure CLI 登入其 Azure 帳戶。 這種方法的缺點是,開發人員的帳戶可能比應用程式所需的許可權還多。 因此,此方法不會準確地復寫應用程式在生產環境中執行的許可權。 |
在應用程式中使用DefaultAzureCredential
DefaultAzureCredential 是一種有意見、已排序的機制序列,用於驗證至Microsoft Entra ID。 每個驗證機制都是衍生自 TokenCredential 類別的類別,稱為 認證。 在運行時間,DefaultAzureCredential
嘗試使用第一個認證進行驗證。 如果該認證無法取得存取令牌,則會嘗試序列中的下一個認證,依此方式,直到成功取得存取令牌為止。 如此一來,您的應用程式就可以在不同的環境中使用不同的認證,而不需要撰寫環境特定的程序代碼。
若要使用 DefaultAzureCredential
,請將 Azure.Identity,並選擇性地將 Microsoft.Extensions.Azure 套件新增至您的應用程式:
在您選擇的終端機中,瀏覽至應用程式項目目錄,然後執行下列命令:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 這些類別和您自己的自定義服務應該註冊,以便透過整個應用程式的相依性插入來存取它們。 在 Program.cs
中,完成下列步驟來註冊客戶端類別和 DefaultAzureCredential
:
- 使用
Azure.Identity
指令包含Microsoft.Extensions.Azure
和using
命名空間。 - 使用對應的
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
可以擷取環境設定和受控識別設定,以自動向其他服務進行驗證。