教學課程:在 .NET 中搭配使用 Azure Key Vault 與虛擬機器

Azure Key Vault 可協助您保護秘密,例如,API 金鑰、存取應用程式時所需的資料庫連接字串、服務和 IT 資源。

在本教學課程中,您將了解如何讓主控台應用程式從 Azure Key Vault 讀取資訊。 應用程式會使用虛擬機器受控識別,向 Key Vault 進行驗證。

本教學課程說明如何:

  • 建立資源群組。
  • 建立金鑰保存庫。
  • 將秘密新增至金鑰保存庫。
  • 從金鑰保存庫擷取祕密。
  • 建立 Azure 虛擬機器。
  • 啟用虛擬機器的受控識別
  • 對 VM 身分識別指派權限。

在開始之前,請先閱讀 Key Vault 基本概念

如果您沒有 Azure 訂閱,請建立免費帳戶

必要條件

若為 Windows、Mac 和 Linux:

建立資源並指派權限

在您開始編碼之前,您必須建立一些資源,將祕密放入您的金鑰保存庫,以及指派權限。

登入 Azure

若要使用下列命令登入 Azure:

az login

建立資源群組和金鑰保存庫

本快速入門會使用預先建立的 Azure 金鑰保存庫。 您可以遵循 Azure CLI 快速入門Azure PowerShell 快速入門Azure 入口網站快速入門中的步驟來建立金鑰保存庫。

或者,您也可以直接執行下面的 Azure CLI 或 Azure PowerShell 命令。

重要

每個金鑰保存庫必須有唯一的名稱。 在下列範例中,將 <your-unique-keyvault-name> 取代為您的金鑰保存庫名稱。

az group create --name "myResourceGroup" -l "EastUS"

az keyvault create --name "<your-unique-keyvault-name>" -g "myResourceGroup"

將祕密填入金鑰保存庫

讓我們建立一個名為 的祕密,其值為 Success!。 祕密可以是密碼、SQL 連接字串,也可以是任何您必須安全保存並可供應用程式使用的其他資訊。

若要將祕密新增至新建立的金鑰保存庫,請使用下列命令:

az keyvault secret set --vault-name "<your-unique-keyvault-name>" --name "mySecret" --value "Success!"

建立虛擬機器

使用下列其中一個方法來建立 Windows 或 Linux 虛擬機器:

Windows Linux
Azure CLI Azure CLI
PowerShell PowerShell
Azure 入口網站 Azure 入口網站

將身分識別指派給 VM

使用下列範例,為虛擬機器建立系統指派的身分識別:

az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>

請注意下列程式碼中所顯示的系統指派身分識別。 上述命令的輸出會是:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

對 VM 身分識別指派權限

使用 az keyvault set-policy 命令,對您的金鑰保存庫指派先前建立的身分識別權限:

az keyvault set-policy --name '<your-unique-key-vault-name>' --object-id <VMSystemAssignedIdentity> --secret-permissions  get list set delete

登入虛擬機器

若要登入虛擬機器,請遵循連線和登入 Azure Windows 虛擬機器連線和登入 Azure Linux 虛擬機器中的指示。

設定主控台應用程式

使用 dotnet 命令來建立主控台應用程式並安裝必要的套件。

安裝 .NET Core

若要安裝 .NET Core,請移至 .NET 下載頁面。

建立和執行 .NET 應用程式範例

開啟命令提示字元。

您可以執行下列命令以在主控台中列印出「Hello World」:

dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run

Install the package

從主控台視窗安裝適用於 .NET 的 Azure Key Vault 祕密用戶端程式庫:

dotnet add package Azure.Security.KeyVault.Secrets

對於本快速入門,您將需要安裝下列身分識別套件,向 Azure Key Vault 進行驗證:

dotnet add package Azure.Identity

編輯主控台應用程式

開啟 Program.cs 檔案並新增這些套件:

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

新增以下幾行,更新 URI 以反映金鑰保存庫的 vaultUri。 以下程式碼使用 'DefaultAzureCredential()' 來向金鑰保存庫進行驗證,這會使用來自應用程式受控識別的權杖進行驗證。 如果金鑰保存庫遭到節流,其也會使用指數輪詢來進行重試。

  class Program
    {
        static void Main(string[] args)
        {
            string secretName = "mySecret";
            string keyVaultName = "<your-key-vault-name>";
            var kvUri = "https://<your-key-vault-name>.vault.azure.net";
            SecretClientOptions options = new SecretClientOptions()
            {
                Retry =
                {
                    Delay= TimeSpan.FromSeconds(2),
                    MaxDelay = TimeSpan.FromSeconds(16),
                    MaxRetries = 5,
                    Mode = RetryMode.Exponential
                 }
            };

            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential(),options);

            Console.Write("Input the value of your secret > ");
            string secretValue = Console.ReadLine();

            Console.Write("Creating a secret in " + keyVaultName + " called '" + secretName + "' with the value '" + secretValue + "' ...");

            client.SetSecret(secretName, secretValue);

            Console.WriteLine(" done.");

            Console.WriteLine("Forgetting your secret.");
            secretValue = "";
            Console.WriteLine("Your secret is '" + secretValue + "'.");

            Console.WriteLine("Retrieving your secret from " + keyVaultName + ".");

            KeyVaultSecret secret = client.GetSecret(secretName);

            Console.WriteLine("Your secret is '" + secret.Value + "'.");

            Console.Write("Deleting your secret from " + keyVaultName + " ...");

            client.StartDeleteSecret(secretName);

            System.Threading.Thread.Sleep(5000);
            Console.WriteLine(" done.");

        }
    }

清除資源

不再需要時,請刪除虛擬機器和金鑰保存庫。

下一步