如何在.NET Framework 4.7.1中使用Azure KeyVault覆盖Web.config的值

7
如何在ASP.NET Framework 4.7.1的WebForms应用程序中实现Microsoft的Azure KeyVault,以使用KeyVault中的值覆盖web.config中的值?我看到需要至少.NET Framework 4.7.1的最低版本才能这样做,但Microsoft提供的示例是针对.NET Core的。我的配置文件为web.config文件,而不是appsettings.json。我还有Global.asax.cs文件,而不是Startup.csProgram.cs
1个回答

5

在ASP.NET Framework 4.7.1 WebForms应用程序中实施Microsoft的Azure KeyVault,首先您需要创建一个Azure Key Vault。

  • 您需要提供资源组、唯一名称和位置,然后点击“Review + Create”。
  • 可以参考创建Azure keyvault的步骤,点击这里>>(https://learn.microsoft.com/en-us/azure/key-vault/quick-create-portal
  • 接下来选择“Secrets”选项卡,并添加您的应用程序设置和连接字符串,这些可以在web.config文件中访问。您可以点击“Generate/Import”按钮,并选择“Manual”作为上传选项。然后将您的应用程序设置和连接字符串配置为名称和值选项。其他选项保持默认设置。

ASP.NET中的配置构建器提供了一种通过使用不同的来源(环境变量、密钥保管库等)来修改和/或覆盖来自配置文件(在ASP.NET的情况下是Web.config)的值的方法。

连接到Azure Key Vault:

要从Visual Studio连接到Azure Key Vault,您需要右键单击项目,然后选择“添加”>“连接服务”菜单。 enter image description here 在选项中,选择“使用Azure Key Vault安全保护秘密”的选项。

enter image description here

现在,如果您尚未登录到您的帐户,请先登录,然后从列表中选择所需的密钥保管库。 enter image description here 然后,点击“添加”按钮将密钥保管库引用添加到您的应用程序中。这将在项目中添加对NuGet包Microsoft.Configuration.ConfigurationBuilders.Azure的引用。
同时,它还会在Web.Config文件中添加一些配置。
或者,
在解决方案资源管理器中,右键单击您的项目,然后选择管理NuGet包。在浏览选项卡中,找到并安装Microsoft.Configuration.ConfigurationBuilders.Azure。
打开您的web.config文件,并编写以下代码:
a) 使用您的密钥保管库名称,按照下面的方式添加configSections和configBuilders。
     <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>

b) 找到appSettings标签,添加一个属性configBuilders="AzureKeyVault",并添加以下行:

    <appSettings configBuilders="AzureKeyVault">
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      <add key="TextAnalyticsKey" value="from key vault" />
    </appSettings>

    <connectionStrings configBuilders="AzureKeyVault">
      <add name="DefaultConnection" connectionString="from key vault" providerName="System.Data.SqlClient" />
      <add key="StorageConnectionString" value="from key vault" />
    </connectionStrings>

c)编辑HomeController.cs中的About方法,以显示确认的值。

    public ActionResult About()
    {
        ViewBag.Message = "Key vault value = " + ConfigurationManager.AppSettings["TextAnalyticsKey"];
    }

这样,您可以在经典的ASP.NET MVC应用程序中连接和使用Azure Key Vault,如果您的应用程序运行时使用的是.NET Framework 4.7或更高版本。
以下文件可以详细解释相同的内容:
- [链接1](https://learn.microsoft.com/en-us/azure/key-vault/general/vs-key-vault-add-connected-service#added-references-for-aspnet-framework) - [链接2](https://dotnetthoughts.net/azure-key-vault-in-aspnet-mvc/) 可以帮助您在ASP.NET MVC应用程序中连接和使用Azure Key Vault。

你好,感谢提供信息。然而,当web.config中的密钥名称包含'.'字符时,如何从键库中获取配置设置呢?例如:<add key="DB.StorageConnectionString" value="from key vault" />。KeyVault不支持句点字符,因此我已将其替换为破折号。是否有一种方法可以转换来自KeyVault的密钥名称,使其与web.config中的内容相匹配? - Bmoe
嗨。我不需要在KeyVault中重命名它们。需要在获取了密钥之后再将它们重命名。我基本上需要一个类似于此处所示的KeyVaultSecretManager的等效物:https://learn.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1#use-a-key-name-prefix。不同之处在于,我需要选项来不传递前缀,而是使用web.config文件代替appsettings.json - Bmoe
你可能想看一下这篇文章>> https://www.c-sharpcorner.com/article/integrating-azure-key-vaults-with-classic-asp-net-applications/ - kavyaS
谢谢您的文章。我可能错过了,但在附加的链接中,它在哪里显示我如何重命名我之前所述的秘密? - Bmoe
@Bmoe:我只听说过Azure密钥保管库不能使用冒号作为分隔符(https://learn.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-5.0#bind-an-array-to-a-class),但我不知道你不能使用点。你是从哪里得到这个信息的? - David Liang
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接