裝載於 Azure 外部的應用程式,例如內部部署或第三方資料中心,應該透過 Microsoft Entra ID 使用應用程式服務主體向 Azure 服務進行驗證。 在前面的各節中,您將瞭解:
- 如何使用 Microsoft Entra 註冊應用程式,以建立服務主體
- 如何將角色指派給範圍許可權
- 如何從應用程式程式代碼使用服務主體進行驗證
使用專用的應用程式服務主體可讓您遵守存取 Azure 資源時的最低許可權原則。 許可權僅限於開發期間應用程式的特定需求,以防止意外存取適用於其他應用程式或服務的 Azure 資源。 這種方法還有助於避免當應用程式移至生產環境時出現問題,方法是確保它在開發環境中不會被賦予過高的權限。
應該為每個裝載應用程式的環境建立不同的應用程式註冊。 這可讓每個服務主體設定環境特定的資源許可權,並確定部署到某個環境的應用程式不會與屬於另一個環境的 Azure 資源交談。
在 Azure 中註冊應用程式
應用程式服務主體是透過 Azure 入口網站或 Azure CLI 在 Azure 進行應用程式註冊時所建立的。
在 Azure 入口網站中,使用搜尋列流覽至 [應用程式註冊] 頁面。
在 [應用程式註冊] 頁面上,選取 [+ 新增註冊]。
在 [註冊應用程式] 頁面 上:
- 針對 [名稱] 字段,輸入包含應用程式名稱和目標環境的描述性值。
- 針對 支援的帳戶類型,請選擇 只有此組織目錄的帳戶(僅限 Microsoft 客戶主導 - 單一租戶),或是最符合您需求的選項。
選取 [註冊] 以註冊您的應用程式並建立服務主體。
在應用程式的 [應用程式註冊] 頁面上,複製 應用程式識別碼 和 目錄(租使用者)標識碼 並貼到暫存位置,以供稍後在應用程式程式代碼組態中使用。
選取 [[新增憑證或秘密],以設定應用程式的認證。
在 [憑證 & 秘密] 頁面上,選取 [+ 新增客戶端密碼]。
在開啟的 [新增客戶端密碼 彈出面板:
- 針對 [描述],輸入 Current 的值。
- 針對 Expires 值,請保留建議的預設值 180 天。
- 選取 以新增 來加入秘密。
在 [憑證 & 秘密] 頁面上,複製用戶端密鑰的 Value 屬性,以供日後步驟使用。
注意
客戶端密碼值只會在建立應用程式註冊之後顯示一次。 您可以新增更多客戶端密碼,而不會使此客戶端密碼失效,但無法再次顯示此值。
將角色指派給應用程式服務主體
接下來,決定您的應用程式需要哪些資源的角色(許可權),並將這些角色指派給您建立的服務主體。 您可以在資源、資源群組或訂用帳戶範圍指派角色。 此範例示範如何在資源群組範圍中指派角色,因為大部分的應用程式都會將其所有 Azure 資源群組組成單一資源群組。
在 Azure 入口網站中,流覽至包含您應用程式的資源群組 概觀 頁面。
從左側導覽中選擇 存取控制(IAM)。
在 [存取控制 (IAM)] 頁面上,選取 [+ 新增],然後從下拉式選單中選擇 [新增角色指派]。 [新增角色指派] 頁面提供數個索引標籤來設定和指派角色。
在 [角色] 索引標籤上,使用搜尋方塊找出您要指派的角色。 選擇角色,然後選擇 下一步。
在 [成員] 標籤頁上:
- 針對 [指派存取權給 值],請選取 [[使用者]、[群組] 或服務主體 。
- 針對 [成員] 值,選擇 [+ 選取成員] 開啟 [選取成員] 飛出視窗面板。
- 搜尋您稍早建立的服務主體,並從篩選的結果中選取它。 選擇 ,然後選擇 以選取群組並關閉彈出面板。
- 在 [ 成員] 索引卷標底部,選取 [檢閱 + 指派]。
在 [檢閱 + 指派] 標籤上,選擇頁面底部的 [檢閱 + 指派]。
設定應用程式環境變數
在執行時,來自 Azure 身分識別程式庫的特定認證,例如 DefaultAzureCredential
、EnvironmentCredential
和 ClientSecretCredential
,在環境變數中按約定搜尋服務主體資訊。 使用 .NET 時,有多種方式可以設定環境變數,視您的工具和環境而定。
無論您選擇何種方法,請為服務主體設定下列環境變數:
-
AZURE_CLIENT_ID
:用來識別 Azure 中已註冊的應用程式。 -
AZURE_TENANT_ID
:Microsoft Entra 租戶的識別碼。 -
AZURE_CLIENT_SECRET
:為應用程式產生的秘密認證。
在 Visual Studio 中,環境變數可以在專案的 Properties
資料夾中的 launchsettings.json
檔案中設定。 這些值會在應用程式啟動時自動提取。 不過,這些設定不會在部署期間隨您的應用程式一起移動,因此您必須在目標裝載環境上設定環境變數。
"profiles": {
"SampleProject": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7177;http://localhost:5177",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID":"<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID":"<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
}
}
從您的應用程式向 Azure 服務進行驗證
Azure 身分識別程式庫 提供各種 認證—實作 TokenCredential
,以支援不同的情境和 Microsoft Entra 驗證流程。 後續步驟示範如何在本地和生產環境中與服務主體一起使用 ClientSecretCredential。
實作程序代碼
新增 Azure.Identity 套件。 在 ASP.NET Core 專案中,也安裝 Microsoft.Extensions.Azure 套件:
在您選擇的終端機中,瀏覽至應用程式項目目錄,然後執行下列命令:
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure
Azure 服務是使用來自各種 Azure SDK 用戶端連結庫的特殊客戶端類別來存取。 這些類別和您自己的自定義服務應該註冊為相依性插入,以便在整個應用程式中使用它們。 在 Program.cs
中,完成下列步驟來設定用戶端類別以進行相依性插入和令牌型驗證:
- 透過
using
指令包含Azure.Identity
和Microsoft.Extensions.Azure
命名空間。 - 使用對應的
Add
前置擴充方法註冊 Azure 服務用戶端。 - 使用
tenantId
、clientId
和clientSecret
設定ClientSecretCredential
。 - 將
ClientSecretCredential
實例傳遞至UseCredential
方法。
builder.Services.AddAzureClients(clientBuilder =>
{
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});
UseCredential
方法的替代方法是直接將認證提供給服務用戶端:
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new ClientSecretCredential(tenantId, clientId, clientSecret)));