從內部部署裝載的 .NET 應用程式向 Azure 資源進行驗證
裝載於 Azure 外部的應用程式 (例如內部部署或第三方資料中心) 應該使用應用程式服務主體,在存取 Azure 資源時向 Azure 進行驗證。 系統會在 Azure 中使用應用程式註冊程序來建立應用程式服務主體物件。 建立應用程式服務主體時,將會為您的應用程式產生用戶端識別碼和用戶端密碼。 接著,用戶端識別碼、用戶端密碼和租用戶識別碼會儲存在環境變數中,讓 Azure SDK for .NET 用來在執行階段向 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
支援多種驗證方法,並會決定執行階段期間使用的驗證方法。 因此,您的應用程式可在相異的環境中使用不同的驗證方法,無須實作環境特定程式碼。
DefaultAzureCredential
尋找認證的順序和位置,可在 DefaultAzureCredential中找到。
為實作 DefaultAzureCredential
,請先將 Azure.Identity
與選擇性的 Microsoft.Extensions.Azure
套件新增至您的應用程式。 您可透過命令列或 NuGet 套件管理員執行此動作。
在應用程式專案目錄中開啟您想要的終端環境,然後輸入下列命令。
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
Azure 服務通常使用 SDK 的對應用戶端類別來存取。 這些類別和您自訂的服務都應在 Program.cs
檔案中註冊,使其可在應用程式中透過相依性插入來存取。 請依照下列步驟,在 Program.cs
內正確設定您的服務和 DefaultAzureCredential
。
- 用 Using 陳述式納入
Azure.Identity
和Microsoft.Extensions.Azure
命名空間。 - 用相關的協助程式方法註冊 Azure 服務。
- 將
DefaultAzureCredential
物件的執行個體傳遞至UseCredential
方法。
下列程式碼區段示範其中一種範例。
using Microsoft.Extensions.Azure;
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
x.UseCredential(new DefaultAzureCredential());
});
或者,您也可以更直接地在服務中使用 DefaultAzureCredential
,而不求助於其他 Azure 註冊方法,如下所示。
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
上述程式碼在本機開發期間於本機工作站上執行時,會尋找環境變數中的應用程式服務主體,或在 Visual Studio、VS Code、Azure CLI 或 Azure PowerShell 中尋找一組開發人員認證;任意者皆可於本機開發期間用來向 Azure 資源驗證應用程式。
部署至 Azure 時,這同一組程式碼也可向其他 Azure 資源驗證您的應用程式。 DefaultAzureCredential
可擷取環境設定與受控識別設定,以便自動向其他服務進行驗證。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應