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 訂閱。 免費建立一個。
- .NET 8.0 SDK 或更新版。
Azure CLI 或Azure PowerShell 。- Azure Key Vault。 你可以透過 Azure portal、Azure CLI 或 Azure PowerShell 來建立金鑰保險庫。
- 金鑰保存庫 祕密。 你可以使用 Azure portal、PowerShell 或 Azure CLI 來建立秘密。
如果您已經在 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"
}
要透過
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!」的地方,現在會顯示你的密鑰值。