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 我仍然认为这应该是可能的,因为唯一的问题是嵌套值。上面的问题很相似,但我想详细说明一下已经测试过的内容以及我遇到的问题。

https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/transforms-variable-substitution?view=azure-devops&tabs=Classic#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 编写的任务。

https://daniel-krzyczkowski.github.io/How-to-inject-Azure-Key-Vault-secrets-in-the-Azure-DevOps-CICD-pipelines/

我也知道可以使用 Pipeline 变量来存储值,但我们不想拥有单一的真实来源,那就是 Azure Key Vault Secret。

从 VSTS(Visual Studio Team Services)阅读了类似的问题并能够解决它。

创建了一个名为 ConnectionStrings.DefaultConnectionPipeline 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