使用 Visual Studio 连接服务将 Key Vault 添加到 Web 应用程序

本教程介绍如何轻松添加所需的设置,以开始使用 Azure Key Vault 在 Visual Studio 中管理 Web 项目的机密,不管使用的是 ASP.NET Core 还是任何类型的 ASP.NET 项目。 通过使用 Visual Studio 中的连接的服务功能,可以让 Visual Studio 自动添加连接到 Azure 中的 Key Vault 所需的所有 NuGet 包和配置设置。

有关连接服务为了启用 Key Vault 而在项目中所做的更改的详细信息,请参阅 Key Vault 连接服务 - 我的 ASP.NET 4.7.1 项目发生了什么情况Key Vault 连接服务 - 我的 ASP.NET Core 项目发生了什么情况

必备组件

  • Azure 订阅 如果没有订阅,请注册免费帐户
  • Visual studio 2019 版本 16.3或更高版本,或者安装了Web 开发工作负荷的visual studio 2017 版本 15.7 立即下载
  • 对于使用 Visual Studio 2017 的 ASP.NET (非核心),需要 .NET Framework 4.7.1 或更高版本的开发工具(默认情况下不会安装)。 若要安装这些工具,请启动 Visual Studio 安装程序,依次选择“修改”、“单个组件”,在右侧展开“ASP.NET 和 Web 开发”,然后选择“.NET Framework 4.7.1 开发工具”。
  • ASP.NET 4.7.1 或更高版本,或者 ASP.NET Core 2.0 或更高版本的 web 项目打开。

将 Key Vault 支持添加到项目

在开始之前,请确保已登录到 Visual Studio。 使用用于 Azure 订阅的同一帐户登录。 然后打开 ASP.NET 4.7.1 或更高版本,或 ASP.NET Core 2.0 web 项目,然后执行以下步骤:

  1. 解决方案资源管理器中,右键单击要向其添加 Key Vault 支持的项目,然后选择 "添加 > 连接的服务"。 此时会显示“连接服务”页,其中包含可添加到项目的服务。

  2. 在可用服务的菜单中,选择“使用 Azure Key Vault 来保护机密”。

    选择“使用 Azure Key Vault 来保护机密”

  3. 选择要使用的订阅,然后选择新的或现有的 Key Vault。 如果选择 "新建 Key Vault",则会显示 "编辑" 链接。 选择它以配置新的 Key Vault。

    选择订阅

  4. 在 "编辑 Azure Key Vault" 中,输入要用于 Key Vault 的名称。

  5. 选择现有资源组,或选择使用自动生成的唯一名称创建一个新的资源组 如果要使用不同的名称创建新组,可以使用Azure 门户,然后关闭页面并重新启动以重新加载资源组的列表。

  6. 选择要在其中创建 Key Vault 的位置 如果 Web 应用程序托管在 Azure 中,请选择托管 Web 应用程序的区域,以获得最佳性能。

  7. 选择定价层 有关详细信息,请参阅 Key Vault 定价

  8. 选择 "确定" 以接受配置选项。

  9. 选择现有 Key Vault 或配置新 Key Vault 后,在 Visual Studio 的 " Azure Key Vault " 选项卡中,选择 "添加" 以添加连接的服务。

  10. 选择 "管理此 Key Vault 中存储的机密" 链接,打开 Key Vault 的机密页。 如果关闭了页面或项目,则可以通过选择 "所有服务",在 " Azure 门户中导航到该页面,然后选择"安全性"下的" Key Vault",然后选择 Key Vault。

  11. 在创建的 Key Vault 的 "Key Vault" 部分中,选择 "密码",然后选择 "生成/导入"。

    生成/导入机密

  12. 输入一个机密(如MySecret ),并将其作为测试指定为任何字符串值,然后选择 "创建" 按钮。

    创建机密

  13. (可选)输入另一个机密,但这一次通过将其命名为“Secrets--MySecret”将其放入某个类别。 此语法指定包含机密 "MySecret" 的类别 "机密"。

现在,可以在代码中访问机密。 后续步骤根据使用的是 ASP.NET 4.7.1 还是 ASP.NET Core 而有所不同。

在代码中访问机密(ASP.NET Core)

  1. 在解决方案资源管理器中,右键单击项目,然后选择 "管理 NuGet 包"。 在 "浏览" 选项卡中,找到并安装以下两个 NuGet 包: MICROSOFT.AZURE.SERVICES.APPAUTHENTICATION ; 对于 .net core 2,请添加KeyVault或 For .net core 3,添加KeyVault

  2. 对于 ".NET Core 2",请选择 "Program.cs" 选项卡,然后将 Program 类中的 "BuildWebHost 定义" 更改为以下内容:

         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((ctx, builder) =>
                {
                    var keyVaultEndpoint = GetKeyVaultEndpoint();
                    if (!string.IsNullOrEmpty(keyVaultEndpoint))
                    {
                        var azureServiceTokenProvider = new AzureServiceTokenProvider();
                        var keyVaultClient = new KeyVaultClient(
                            new KeyVaultClient.AuthenticationCallback(
                                azureServiceTokenProvider.KeyVaultTokenCallback));
                        builder.AddAzureKeyVault(
                            keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                    }
                }
             ).UseStartup<Startup>();
    
         private static string GetKeyVaultEndpoint() => "https://<YourKeyVaultName>.vault.azure.net";
     }
    

    对于 .NET Core 3,请使用以下代码。

         public static IHostBuilder CreateHostBuilder(string[] args) =>
             Host.CreateDefaultBuilder(args)
                 .ConfigureAppConfiguration((context, config) =>
                 {
                     var keyVaultEndpoint = GetKeyVaultEndpoint();
                     if (!string.IsNullOrEmpty(keyVaultEndpoint))
                     {
                         var azureServiceTokenProvider = new AzureServiceTokenProvider();
                         var keyVaultClient = new KeyVaultClient(
                             new KeyVaultClient.AuthenticationCallback(
                                 azureServiceTokenProvider.KeyVaultTokenCallback));
                         config.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                     }
                 })
                 .ConfigureWebHostDefaults(webBuilder =>
                 {
                     webBuilder.UseStartup<Startup>();
                 });
         private static string GetKeyVaultEndpoint() => "https://<YourKeyVaultName>.vault.azure.net";
    
  3. 接下来,打开一个页面文件(如Index.cshtml.cs )并编写以下代码:

    1. 使用指令包括对 Microsoft.Extensions.Configuration 的引用:

      using Microsoft.Extensions.Configuration;
      
    2. 添加配置变量。

      private static readonly IConfiguration _configuration;
      
    3. 添加此构造函数或将现有构造函数替换为:

      public IndexModel(IConfiguration configuration)
      {
          _configuration = configuration;
      }
      
    4. 更新 OnGet 方法。 将此处显示的占位符值更新为在上述命令中创建的机密名称。

      public void OnGet()
      {
          ViewData["Message"] = "My key val = " + _configuration["<YourSecretNameThatWasCreatedAbove>"];
      }
      
    5. 若要在运行时确认该值,请添加代码以显示 ViewData["Message"]cshtml文件中,以在消息中显示机密。

          <p>@ViewData["Message"]</p>
      

你可以在本地运行应用程序,以验证是否已成功从 Key Vault 获取密码。

访问机密(ASP.NET)

您可以设置配置,使 web.config 文件在 appSettings 元素中具有一个虚拟值,该元素在运行时被替换为 true 值。 然后,可以通过 ConfigurationManager.AppSettings 的数据结构访问此。

  1. 编辑 web.config 文件。 找到 appSettings 标记,添加属性 configBuilders="AzureKeyVault",并添加一行:

       <add key="mysecret" value="dummy"/>
    
  2. 编辑HomeController.cs中的 About 方法,以显示确认的值。

    public ActionResult About()
    {
        ViewBag.Message = "Key vault value = " + ConfigurationManager.AppSettings["mysecret"];
    }
    
  3. 在调试器下本地运行该应用程序,切换到 "关于" 选项卡,并验证是否显示了来自 Key Vault 的值。

清理资源

不再需要资源组时,可将其删除。 这会删除 Key Vault 和相关的资源。 要通过门户删除资源组,请执行以下操作:

  1. 在门户顶部的“搜索”框中输入资源组的名称。 在搜索结果中看到在本快速入门中使用的资源组后,将其选中。
  2. 选择“删除资源组”。
  3. 在 "键入资源组名称: " 框中,输入资源组的名称,然后选择 "删除"。

故障排除

如果你的 Key Vault 运行的 Microsoft 帐户不同于你在 Visual Studio 中登录的其他(例如,Key Vault 在你的工作帐户上运行,但 Visual Studio 正在使用你的专用帐户),则你在 Program.cs 文件中收到错误,则 Visual Studio 无法访问 Key Vault。 解决此问题:

  1. 中转到Azure 门户并打开 Key Vault。

  2. 选择 "访问策略",然后选择 "添加访问策略",然后选择你作为主体登录的帐户。

  3. 在 Visual Studio 中,选择 "文件 > 帐户设置"。 从 "所有帐户" 部分中选择 "添加帐户"。 使用你选择作为访问策略的主体的帐户登录。

  4. 选择 "工具" > 选项,并查找 " Azure 服务身份验证"。 然后选择刚添加到 Visual Studio 的帐户。

现在,调试应用程序时,Visual Studio 会连接到 Key Vault 所在的帐户。

如何修改您的 ASP.NET Core 项目

本部分列出了使用 Visual Studio 添加 Key Vault 连接服务时对 ASP.NET 项目所做的确切更改。

添加了 ASP.NET Core 的引用

影响项目文件 .NET 引用和 NuGet 包引用。

类型 参考
NuGet Microsoft.AspNetCore.AzureKeyVault.HostingStartup

添加了 ASP.NET Core 的文件

  • 添加了 ConnectedService.json,它将记录有关连接的服务提供程序、版本和链接文档的一些信息。

ASP.NET Core 的项目文件更改

  • 添加了连接的服务 ItemGroup 和 ConnectedServices.json 文件。

ASP.NET Core 的 launchsettings.json 更改

  • 将以下环境变量条目添加到 IIS Express 配置文件和匹配 Web 项目名称的配置文件:

      "environmentVariables": {
        "ASPNETCORE_HOSTINGSTARTUP__KEYVAULT__CONFIGURATIONENABLED": "true",
        "ASPNETCORE_HOSTINGSTARTUP__KEYVAULT__CONFIGURATIONVAULT": "<your keyvault URL>"
      }
    

Azure 上的 ASP.NET Core 更改

  • 创建了资源组(或使用了现有资源组)。
  • 在指定的资源组中创建了密钥保管库。

如何修改 ASP.NET Framework 项目

本部分列出了使用 Visual Studio 添加 Key Vault 连接服务时对 ASP.NET 项目所做的确切更改。

添加了 ASP.NET Framework 引用

影响项目文件 .NET 引用和 packages.config (NuGet 引用)。

类型 参考
.NET; NuGet Microsoft.Azure.KeyVault
.NET; NuGet Microsoft.Azure.KeyVault.WebKey
.NET; NuGet Microsoft.Rest.ClientRuntime
.NET; NuGet Microsoft.Rest.ClientRuntime.Azure

添加了 ASP.NET Framework 文件

  • 添加 ConnectedService.json,这将记录有关连接服务提供商、版本和文档的链接的某些信息。

ASP.NET Framework 的项目文件更改

  • 添加了连接服务 ItemGroup 和 ConnectedServices.json 文件。
  • 请参考添加的引用部分中所述的 .NET 程序集。

web.config 或 app.config 发生更改

  • 添加了以下配置条目:

    <configSections>
      <section
           name="configBuilders"
           type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           restartOnExternalChanges="false"
           requirePermission="false" />
    </configSections>
    <configBuilders>
      <builders>
        <add
             name="AzureKeyVault"
             vaultName="vaultname"
             type="Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Azure, Version=1.0.0.0, Culture=neutral"
             vaultUri="https://vaultname.vault.azure.net" />
      </builders>
    </configBuilders>
    

Azure for ASP.NET Framework 的更改

  • 创建了资源组(或使用了现有资源组)。
  • 在指定的资源组中创建了密钥保管库。

后续步骤

如果遵循本教程,你的 Key Vault 权限将设置为使用你自己的 Azure 订阅运行,但这可能不适合于生产方案。 你可以创建托管标识,以管理应用 Key Vault 访问。 请参阅使用托管标识提供 Key Vault 身份验证

阅读Key Vault 开发人员指南,详细了解 Key Vault 开发。

上一篇:使用 Visual Studio 连接服务添加 Azure 存储

下一篇:在 Visual Studio 中使用连接的服务添加 Azure Active Directory

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程