Azure DevOps -> Pipelines -> Releases -> Access Azure Key Vault Secret -> 嵌套级别 JSON 变量 substitution/transform
Azure DevOps -> Pipelines -> Releases -> Access Azure Key Vault Secret -> nested levels JSON variable substitution/transform
我有一个 appsettings.json
文件,我想在其中转换位于以下位置的值:
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
},
我找到了以下答案,所以我知道应用服务可以直接从密钥库中检索值:
这不是问的理由。由于 Microsoft 提供 JSON variable substitution
我仍然认为这应该是可能的,因为唯一的问题是嵌套值。上面的问题很相似,但我想详细说明一下已经测试过的内容以及我遇到的问题。
可以使用 Pipelines -> Library -> Variable group
或 Azure Key Vault 任务以获取机密值。
问题是秘密值不能包含点:
Please provide a valid secret name. Secret names can only contain
alphanumeric characters and dashes.
无论是在链接的变量组中还是在 Azure Key Vault 任务中,我都不能将机密名称重写为另一个变量名称。
查看下面的示例,如果秘密名称是 ConnectionStringsDefaultConnection
,我可以像这样访问值 $(ConnectionStringsDefaultConnection)
,但我不知道如何重命名它。
https://azuredevopslabs.com/labs/vstsextend/azurekeyvault/
我找到了一个可以完成工作但需要第三方发布任务的任务。这是不可接受的,因为该项目只允许 Microsoft 编写的任务。
我也知道可以使用 Pipeline 变量来存储值,但我们不想拥有单一的真实来源,那就是 Azure Key Vault Secret。
从 VSTS(Visual Studio Team Services)阅读了类似的问题并能够解决它。
创建了一个名为 ConnectionStrings.DefaultConnection
的 Pipeline variable
,它对我的链接变量组具有参考价值。
如果我的秘密被命名为 ConnectionStringsDefaultConnection
,我会把它连接起来作为一个链接变量,然后添加 $(ConnectionStringsDefaultConnection)
作为一个值。
来源:
一种选择是直接在您的应用程序中使用 Key Vault,而不是替换您的 appsettings.json。您可以在 CreateHostBuilder
方法中进行配置:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
if (context.HostingEnvironment.IsProduction())
{
var builtConfig = config.Build();
using (var store = new X509Store(StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates
.Find(X509FindType.FindByThumbprint,
builtConfig["AzureADCertThumbprint"], false);
config.AddAzureKeyVault(
$"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
builtConfig["AzureADApplicationId"],
certs.OfType<X509Certificate2>().Single());
store.Close();
}
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
请检查documentation。
我有一个 appsettings.json
文件,我想在其中转换位于以下位置的值:
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
},
我找到了以下答案,所以我知道应用服务可以直接从密钥库中检索值:
这不是问的理由。由于 Microsoft 提供 JSON variable substitution
我仍然认为这应该是可能的,因为唯一的问题是嵌套值。上面的问题很相似,但我想详细说明一下已经测试过的内容以及我遇到的问题。
可以使用 Pipelines -> Library -> Variable group
或 Azure Key Vault 任务以获取机密值。
问题是秘密值不能包含点:
Please provide a valid secret name. Secret names can only contain alphanumeric characters and dashes.
无论是在链接的变量组中还是在 Azure Key Vault 任务中,我都不能将机密名称重写为另一个变量名称。
查看下面的示例,如果秘密名称是 ConnectionStringsDefaultConnection
,我可以像这样访问值 $(ConnectionStringsDefaultConnection)
,但我不知道如何重命名它。
https://azuredevopslabs.com/labs/vstsextend/azurekeyvault/
我找到了一个可以完成工作但需要第三方发布任务的任务。这是不可接受的,因为该项目只允许 Microsoft 编写的任务。
我也知道可以使用 Pipeline 变量来存储值,但我们不想拥有单一的真实来源,那就是 Azure Key Vault Secret。
从 VSTS(Visual Studio Team Services)阅读了类似的问题并能够解决它。
创建了一个名为 ConnectionStrings.DefaultConnection
的 Pipeline variable
,它对我的链接变量组具有参考价值。
如果我的秘密被命名为 ConnectionStringsDefaultConnection
,我会把它连接起来作为一个链接变量,然后添加 $(ConnectionStringsDefaultConnection)
作为一个值。
来源:
一种选择是直接在您的应用程序中使用 Key Vault,而不是替换您的 appsettings.json。您可以在 CreateHostBuilder
方法中进行配置:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
if (context.HostingEnvironment.IsProduction())
{
var builtConfig = config.Build();
using (var store = new X509Store(StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates
.Find(X509FindType.FindByThumbprint,
builtConfig["AzureADCertThumbprint"], false);
config.AddAzureKeyVault(
$"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
builtConfig["AzureADApplicationId"],
certs.OfType<X509Certificate2>().Single());
store.Close();
}
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
请检查documentation。