如何在 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 操作) .
- 为连接字符串、clientsecret、appid 等创建秘密
开发和其他环境。
- 您可以为将覆盖的环境添加连接字符串
本地应用程序设置。参考:Managing Secrets-TechNet Wiki
(microsoft.com)
或
- 创建 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"];
参考文献:
我已经在 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 操作) .
- 为连接字符串、clientsecret、appid 等创建秘密 开发和其他环境。
- 您可以为将覆盖的环境添加连接字符串 本地应用程序设置。参考:Managing Secrets-TechNet Wiki (microsoft.com)
或
- 创建 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"];
参考文献: