教學:使用管理身份將 金鑰保存庫 連接到 .NET 中的 Azure 網頁應用程式

Azure Key Vault 提供一種以更高安全性儲存憑證及其他機密的方式。 但你的程式碼需要透過 金鑰保存庫 認證才能取得它們。 Azure 資源的管理身份透過在 Microsoft Entra ID 中自動賦予 Azure 服務一個管理身份來解決這個問題。 你的程式碼會用這個身份驗證任何支援 Microsoft Entra 認證的服務,包括 金鑰保存庫,且不會在程式碼中嵌入憑證。

在這個教學中,你會建立並部署一個 Azure 網頁應用程式到 Azure App 服務,然後使用管理身份驗證應用程式,透過 Azure Key Vault 的 .NET 秘密客戶端函式庫和 Azure CLI 來驗證該應用程式到金鑰保險庫。 如果你使用其他語言,例如 Azure PowerShell 或 Azure 入口網站,原則相同。

欲了解更多關於 App Service 網頁應用及部署的資訊,請參閱:

先決條件

若要完成本教學課程,您需要:

如果您已經在 Azure App 服務 中部署 Web 應用程式,請直接跳至 設定 Web 應用程式以連線到 金鑰保存庫 和 修改應用程式以存取您的金鑰保存庫。

建立一個 .NET Core 應用程式

在此步驟中,建立本地的 .NET 專案。

在終端機視窗中,建立一個名為 akvwebapp 的目錄,然後切換到該目錄:

mkdir akvwebapp
cd akvwebapp

使用 dotnet 新網頁指令建立 .NET 網頁應用程式:

dotnet new web

在部署到 Azure 前,先在本地執行應用程式,看看它的效果:

dotnet run

在網頁瀏覽器中,於 http://localhost:5000 開啟應用程式。 你會看到範例應用程式上的「Hello World!」訊息。

欲了解更多關於建立網頁應用程式的資訊,請參閱在 Azure App 服務 中建立 ASP.NET Core 網頁應用程式。

將應用程式部署到 Azure

在此步驟中,使用 zip 部署將 .NET 應用程式部署至 Azure App 服務。 Zip 部署是應用服務推薦的基於套件的部署機制。 若要從原始碼控制持續交付,建議使用 GitHub Actions 或 Azure DevOps Pipelines。

建立資源群組

使用 az 群組 create 建立資源群組以包含金鑰庫與網頁應用程式:

az group create --name "<resource-group>" --location "EastUS"

建立 App Service 方案

使用 az appservice plan create 建立 App Service 方案。 以下範例會在免費(FREE)層級中建立名為 myAppServicePlan 的方案:

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

建立 Web 應用程式

在 myAppServicePlan 方案中建立一個 Azure Web 應用程式。

這很重要

就像金鑰保險庫一樣,Azure 網頁應用程式必須擁有全域唯一的名稱。 用你網頁應用程式的名稱來取代 <webapp-name> 。

az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"

請前往新應用程式確認是否正在運行:

https://<webapp-name>.azurewebsites.net

你會看到一個新的 Azure 網頁應用程式的預設頁面。

使用 Zip Deploy 部署您的本機應用程式

從專案目錄中 akvwebapp 建立專案並建立部署壓縮檔:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Tip

在未使用 zip 的 Windows 上,請使用 PowerShell:Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip。

使用 az webapp deploy 將 zip 部署到你的網頁應用程式:

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

在瀏覽器中重新整理已部署的應用程式:

https://<webapp-name>.azurewebsites.net

你會看到和你在 http://localhost:5000 看到的相同「Hello World!」訊息。

設定 Web 應用程式以連接到 金鑰保存庫

在這個區塊中,你可以啟用網頁應用程式存取 金鑰保存庫,並更新應用程式代碼以取得一個秘密。

建立並指派受控識別的存取權

使用管理身份來驗證網頁應用程式到 金鑰保存庫。 託管身份消除了你在程式碼中管理憑證的需求。

請使用 az webapp identity assign 建立應用程式的身份:

az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"

該指令會回傳一個類似這樣的 JSON 片段:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

要透過 Role-Based 存取控制(RBAC) 取得你的金鑰保險庫權限,請使用 Azure CLI 指令 az role assignment create 指派一個角色給你的「使用者主體名稱」(UPN)。

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

將<upn>、<subscription-id>和<vault-name>取代為您的實際值。 如果你用了不同的資源群組名稱,也請把「myResourceGroup」替換掉。 您的 UPN 格式通常是電子郵件地址 (例如,username@domain.com)。

修改應用程式以存取您的金鑰保存庫

這個教學使用 Azure Key Vault 祕密用戶端程式庫。 你也可以使用 Azure Key Vault 憑證客戶端函式庫或 Azure Key Vault 金鑰客戶端函式庫。

安裝套件

從終端機視窗安裝 Azure Key Vault 秘密客戶端函式庫與 Azure Identity 用戶端函式庫:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

更新程式碼

在你的akvwebapp專案中開啟Program.cs。

請在檔案頂端新增以下 using 指令:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

在 app.MapGet 呼叫之前加入以下幾行,並將 <vault-name> 更新為你的金鑰保存庫名稱。 此程式碼使用 DefaultAzureCredential,透過網頁應用程式的受控識別向 金鑰保存庫 進行驗證。 更多資訊請參閱 開發者指南。 程式碼也會設定重試的指數型倒退,以因應 金鑰保存庫 遭到節流的情況。 有關交易限制的詳細資訊,請參閱 Azure Key Vault 限速指引。

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

將這句話 app.MapGet("/", () => "Hello World!"); 更新為:

app.MapGet("/", () => secretValue);

儲存您的變更。

重新部署 Web 應用程式

重建部署套件並重新部署:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

移至您已完成的 Web 應用程式

https://<webapp-name>.azurewebsites.net

原本顯示「Hello World!」的地方,現在會顯示你的密鑰值。

後續步驟