本教程介绍如何轻松添加所需的设置,以开始使用 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 项目发生了什么情况。
在开始之前,请确保已登录到 Visual Studio。 使用用于 Azure 订阅的同一帐户登录。 然后打开 ASP.NET 4.7.1 或更高版本,或 ASP.NET Core 2.0 web 项目,然后执行以下步骤:
在解决方案资源管理器中,右键单击要向其添加 Key Vault 支持的项目,然后选择 "添加 > 连接的服务"。 此时会显示“连接服务”页,其中包含可添加到项目的服务。
在可用服务的菜单中,选择“使用 Azure Key Vault 来保护机密”。
选择要使用的订阅,然后选择新的或现有的 Key Vault。 如果选择 "新建 Key Vault",则会显示 "编辑" 链接。 选择它以配置新的 Key Vault。
在 "编辑 Azure Key Vault" 中,输入要用于 Key Vault 的名称。
选择现有资源组,或选择使用自动生成的唯一名称创建一个新的资源组。 如果要使用不同的名称创建新组,可以使用Azure 门户,然后关闭页面并重新启动以重新加载资源组的列表。
选择要在其中创建 Key Vault 的位置。 如果 Web 应用程序托管在 Azure 中,请选择托管 Web 应用程序的区域,以获得最佳性能。
选择定价层。 有关详细信息,请参阅 Key Vault 定价。
选择 "确定" 以接受配置选项。
选择现有 Key Vault 或配置新 Key Vault 后,在 Visual Studio 的 " Azure Key Vault " 选项卡中,选择 "添加" 以添加连接的服务。
选择 "管理此 Key Vault 中存储的机密" 链接,打开 Key Vault 的机密页。 如果关闭了页面或项目,则可以通过选择 "所有服务",在 " Azure 门户中导航到该页面,然后选择"安全性"下的" Key Vault",然后选择 Key Vault。
在创建的 Key Vault 的 "Key Vault" 部分中,选择 "密码",然后选择 "生成/导入"。
输入一个机密(如MySecret ),并将其作为测试指定为任何字符串值,然后选择 "创建" 按钮。
(可选)输入另一个机密,但这一次通过将其命名为“Secrets--MySecret”将其放入某个类别。 此语法指定包含机密 "MySecret" 的类别 "机密"。
现在,可以在代码中访问机密。 后续步骤根据使用的是 ASP.NET 4.7.1 还是 ASP.NET Core 而有所不同。
在解决方案资源管理器中,右键单击项目,然后选择 "管理 NuGet 包"。 在 "浏览" 选项卡中,找到并安装以下两个 NuGet 包: MICROSOFT.AZURE.SERVICES.APPAUTHENTICATION ; 对于 .net core 2,请添加KeyVault或 For .net core 3,添加KeyVault。
对于 ".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";
接下来,打开一个页面文件(如Index.cshtml.cs )并编写以下代码:
使用指令包括对 Microsoft.Extensions.Configuration
的引用:
using Microsoft.Extensions.Configuration;
添加配置变量。
private static readonly IConfiguration _configuration;
添加此构造函数或将现有构造函数替换为:
public IndexModel(IConfiguration configuration) { _configuration = configuration; }
更新 OnGet
方法。 将此处显示的占位符值更新为在上述命令中创建的机密名称。
public void OnGet() { ViewData["Message"] = "My key val = " + _configuration["<YourSecretNameThatWasCreatedAbove>"]; }
若要在运行时确认该值,请添加代码以显示 ViewData["Message"]
到cshtml文件中,以在消息中显示机密。
<p>@ViewData["Message"]</p>
你可以在本地运行应用程序,以验证是否已成功从 Key Vault 获取密码。
您可以设置配置,使 web.config 文件在 appSettings
元素中具有一个虚拟值,该元素在运行时被替换为 true 值。 然后,可以通过 ConfigurationManager.AppSettings
的数据结构访问此。
编辑 web.config 文件。 找到 appSettings 标记,添加属性 configBuilders="AzureKeyVault"
,并添加一行:
<add key="mysecret" value="dummy"/>
编辑HomeController.cs中的 About
方法,以显示确认的值。
public ActionResult About() { ViewBag.Message = "Key vault value = " + ConfigurationManager.AppSettings["mysecret"]; }
在调试器下本地运行该应用程序,切换到 "关于" 选项卡,并验证是否显示了来自 Key Vault 的值。
不再需要资源组时,可将其删除。 这会删除 Key Vault 和相关的资源。 要通过门户删除资源组,请执行以下操作:
如果你的 Key Vault 运行的 Microsoft 帐户不同于你在 Visual Studio 中登录的其他(例如,Key Vault 在你的工作帐户上运行,但 Visual Studio 正在使用你的专用帐户),则你在 Program.cs 文件中收到错误,则 Visual Studio 无法访问 Key Vault。 解决此问题:
中转到Azure 门户并打开 Key Vault。
选择 "访问策略",然后选择 "添加访问策略",然后选择你作为主体登录的帐户。
在 Visual Studio 中,选择 "文件 > 帐户设置"。 从 "所有帐户" 部分中选择 "添加帐户"。 使用你选择作为访问策略的主体的帐户登录。
选择 "工具" > 选项,并查找 " Azure 服务身份验证"。 然后选择刚添加到 Visual Studio 的帐户。
现在,调试应用程序时,Visual Studio 会连接到 Key Vault 所在的帐户。
本部分列出了使用 Visual Studio 添加 Key Vault 连接服务时对 ASP.NET 项目所做的确切更改。
影响项目文件 .NET 引用和 NuGet 包引用。
类型 | 参考 |
---|---|
NuGet | Microsoft.AspNetCore.AzureKeyVault.HostingStartup |
ConnectedService.json
,它将记录有关连接的服务提供程序、版本和链接文档的一些信息。ConnectedServices.json
文件。将以下环境变量条目添加到 IIS Express 配置文件和匹配 Web 项目名称的配置文件:
"environmentVariables": { "ASPNETCORE_HOSTINGSTARTUP__KEYVAULT__CONFIGURATIONENABLED": "true", "ASPNETCORE_HOSTINGSTARTUP__KEYVAULT__CONFIGURATIONVAULT": "<your keyvault URL>" }
本部分列出了使用 Visual Studio 添加 Key Vault 连接服务时对 ASP.NET 项目所做的确切更改。
影响项目文件 .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 |
ConnectedService.json
,这将记录有关连接服务提供商、版本和文档的链接的某些信息。添加了以下配置条目:
<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>
如果遵循本教程,你的 Key Vault 权限将设置为使用你自己的 Azure 订阅运行,但这可能不适合于生产方案。 你可以创建托管标识,以管理应用 Key Vault 访问。 请参阅使用托管标识提供 Key Vault 身份验证。
阅读Key Vault 开发人员指南,详细了解 Key Vault 开发。