從內部部署裝載的 .NET 應用程式向 Azure 資源進行驗證
裝載於 Azure 外部的應用程式 (例如內部部署或第三方資料中心) 應該使用應用程式服務主體,在存取 Azure 資源時向 Azure 進行驗證。 系統會在 Azure 中使用應用程式註冊程序來建立應用程式服務主體物件。 建立應用程式服務主體時,將會為您的應用程式產生用戶端識別碼和用戶端密碼。 接著,用戶端識別碼、用戶端密碼和租用戶識別碼會儲存在環境變數中,讓 Azure 身分識別程式庫用來在執行階段向 Azure 驗證您的應用程式。
應該為裝載應用程式所在的每個環境建立不同的應用程式註冊。 這可讓環境特定資源權限針對每個服務主體進行設定,並確定部署到某個環境的應用程式不會與屬於另一個環境的 Azure 資源交談。
1:在 Azure 中註冊應用程式
您可以使用 Azure 入口網站或 Azure CLI 向 Azure 註冊應用程式。
登入 Azure 入口網站並遵循下列步驟。
2:將角色指派給應用程式服務主體
接著,您必須決定應用程式針對哪些資源需要哪些角色 (權限),並將這些角色指派給應用程式。 角色可在資源、資源群組或訂閱範圍內獲派其他角色。 此範例會顯示如何在資源群組範圍內為服務主體指派角色,因為多數應用程式都會將所有 Azure 資源劃分在單一資源群組中。
3:設定應用程式的環境變數
DefaultAzureCredential
物件會於執行階段在一組環境變數中尋找服務主體認證。 使用 .NET 時設定環境變數的方法有很多,視乎於使用的工具和環境而定。
無論您選擇哪一種方法,請在使用服務主體時設定下列環境變數:
AZURE_CLIENT_ID
→ 應用程式識別碼的值。AZURE_TENANT_ID
→ 租用戶識別碼的值。AZURE_CLIENT_SECRET
→ 為應用程式產生的密碼/認證。
如果您的應用程式裝載於 IIS 中,建議您為每個應用程式集區設定環境變數,以隔離應用程式之間的設定。
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost
您也可以直接使用 applicationHost.config
檔案內的 applicationPools
元素來設定這些設定:
<applicationPools>
<add name="CorePool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic">
<environmentVariables>
<add name="ASPNETCORE_ENVIRONMENT" value="Development" />
<add name="AZURE_CLIENT_ID" value="00000000-0000-0000-0000-000000000000" />
<add name="AZURE_TENANT_ID" value="11111111-1111-1111-1111-111111111111" />
<add name="AZURE_CLIENT_SECRET" value="=abcdefghijklmnopqrstuvwxyz" />
</environmentVariables>
</add>
</applicationPools>
4 - 在應用程式中實作 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
可擷取環境設定與受控識別設定,以便自動向其他服務進行驗證。