如何在 MVC Asp.net 应用程序中为每个环境的连接字符串设置 Key Vault 集成

How to set Key Vault integration in MVC Asp.net application for connection string per environment

我已经在 Azure 中为连接字符串设置了 Key-Vault 机密,并更新了我的 Web 配置文件,如下所示,它工作正常。现在我的问题是,如果我需要为 QA、开发、暂存或其他环境提供单独的连接字符串,在部署到 Azure 应用程序服务之前,我是否会手动更新连接字符串名称?有什么方法可以让我不必根据环境更改名称。 (我是手动部署,CI/CD没有参与>

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

编辑:

我已经使用连接服务来生成和获取 nuget 包。代码 运行 很好,连接字符串是从 Key Vault 秘密中挑选出来的,但是当我将代码部署到 Web 应用程序时遇到错误。下面是自动生成的代码。我想知道我是否缺少其他需要的东西。我正在使用 MVC 4.7.2

错误:

建立与 SQL 服务器的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确并且 SQL 服务器配置为允许远程连接。 (提供商:TCP 提供商,错误:0 - 连接尝试失败。

网络配置代码。

<configSections><section name="configBuilders" 
      type="System.Configuration.ConfigurationBuildersSection, 
      System.Configuration, Version=4.0.0.0, Culture=neutral, 
     PublicKeyToken=b03f5f7f22d50a3a" 
 restartOnExternalChanges="false" 
 requirePermission="false" />
</configSections>
 <configBuilders>
   <builders>
<add name="AzureKeyVault" vaultName="Prod-ConSt-01" type 
      "Microsoft.Configuration.ConfigurationBuilders.AzureKeyVaultConfigBuilder,
     Microsoft.Configuration.ConfigurationBuilders.Azure, Version=2.0.0.0, Culture=neutral,
     PublicKeyToken=31bf9256ad364e35"
     vaultUri="https://mywebsite-prod-const-01.vault.azure.net/" />< 
   /builders>
  </configBuilders>

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

我们可以为环境的不同阶段使用环境变量,并基于此我们可以调用为每个阶段创建的特定密钥库,每个阶段都有自己的秘密。 假设我们创建了应用程序服务应用程序 > 为 ex:dev,staging

制作了部署槽

  • 我们可以利用托管身份(Identity).

IDENTITY> SYSTEM ASSIGNED >ON 每个使用 azure active directory 注册应用程序的插槽分别为每个插槽创建客户端机密,这些机密可以存储为机密。

当您搜索所有应用程序时,我们可以找到在 Azure Active Directory 企业应用程序中创建的应用程序和插槽,并且可以记下每个插槽(开发、暂存等)的应用程序 ID、客户端密码。

您可以创建密钥保管库,每个用于开发,一个用于暂存,如果需要,还可以创建其他密钥保管库。

对于 keyvault,您可以为您为应用程序创建的环境插槽创建访问策略(例如:get,list 操作) .

  • 创建 three settings 个文件 appsettings.production.json, appsettings.development.json,以及其他需要的环境和 appsettings.json.

您可以在 web.config 使用环境变量

 {
          "AzureKeyVault": {
             "Endpoint": "put KEYVAULT_ENDPOINT here",
             "ClientId": "XXXX ",
             "ClientSecret": "XXXXXX"
           //”ConnectionString”:"XXXXXXX”
           }
        }

program.cs中调用特定环境的秘密:

public static IHostBuilder CreateHostBuilder(string[] args) =>
             ....
            ....
.ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) =>
            {
                
               ...//code
                    .AddJsonFile($"azurekeyvault.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", false, true);

                
                var configuration = configurationBuilder.Build();
                string keyVaultEndpoint = configuration["AzureKeyVault:Endpoint"];
                string clientId = configuration["AzureKeyVault:ClientId"];
             //string ConnectionString= configuration["AzureKeyVault: ConnectionString "];
                string clientSecret = configuration["AzureKeyVault:ClientSecret"];
           
              
                configurationBuilder.AddAzureKeyVault(keyVaultEndpoint, clientId, clientSecret);
            });

更多信息请参考this博客。

(或)在每个应用程序设置中..json 我们可以provide a vault uri 特定环境保险库。

“Vault Uri”:https://env-demo-keyvault.vault.azure.net/

然后像下面这样调用 program.cs 文件

var keyVaultEndpoint = settings["VaultUri"];

参考文献:

  1. Using Azure Key Vault with ASP.NET Core and Azure App Services
  2. ASP.NET Core + Azure Key Vault + Azure AD MSI-Joonas W's blog