你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:将 Azure Key Vault 与通过 .NET 编写的虚拟机配合使用

Azure Key Vault 可以帮助保护机密,例如访问应用程序、服务和 IT 资源时所需的 API 密钥与数据库连接字符串。

本教程介绍如何获取控制台应用程序,以便从 Azure Key Vault 读取信息。 应用程序将使用虚拟机托管标识对 Key Vault 进行身份验证。

本教程介绍如何:

  • 创建资源组。
  • 创建密钥保管库。
  • 将机密添加到 Key Vault。
  • 从密钥保管库检索机密。
  • 创建一个 Azure 虚拟机。
  • 为虚拟机启用托管标识
  • 为 VM 标识分配权限。

在开始之前,请阅读 Key Vault 的基本概念

如果还没有 Azure 订阅,可以创建一个免费帐户

先决条件

对于 Windows、Mac 和 Linux:

创建资源并分配权限

在开始编码之前,需要创建一些资源,将机密放入密钥保管库,并分配权限。

登录 Azure

使用以下命令登录到 Azure:

az login

创建资源组和 Key Vault

本快速入门使用预先创建的 Azure 密钥保管库。 可以遵循 Azure CLI 快速入门Azure PowerShell 快速入门Azure 门户快速入门中的步骤创建 Key Vault。

或者,也可运行这些 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" --enable-rbac-authorization

使用机密填充密钥保管库

让我们创建一个名为 mySecret 的机密,其值为 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 标识分配权限

若要通过基于角色的访问控制 (RBAC) 授予应用程序对密钥保管库的权限,请使用 Azure CLI 命令 az role assignment create 分配角色。

az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

<app-id><subscription-id><resource-group-name><your-unique-keyvault-name> 替换为实际值。 <app-id> 是你在 Microsoft Entra 中注册的应用程序的“应用程序(客户端) ID”。

登录到虚拟机

若要登录到虚拟机,请按照连接并登录到 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

安装包

在控制台窗口中,安装适用于 .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.");

        }
    }

清理资源

不再需要本教程中创建的虚拟机和 Key Vault 时,请将其删除。

后续步骤