【问题标题】:Azure DevOps -> Pipelines -> Releases -> Access Azure Key Vault Secret -> nested levels JSON variable substitution/transformAzure DevOps -> Pipelines -> 发布 -> 访问 Azure Key Vault Secret -> 嵌套级别 JSON 变量替换/转换
【发布时间】:2020-04-27 22:05:28
【问题描述】:

我有一个appsettings.json 文件,我想在其中转换位于以下位置的值:

"ConnectionStrings": {
  "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
},

我找到了以下答案,所以我知道应用服务可以直接从密钥库中检索值:

https://stackoverflow.com/a/59994040/3850405

这不是问的原因。由于微软提供JSON variable substitution,我仍然认为这应该是可能的,因为唯一的问题是嵌套值。上面的问题很相似,但我想多说明一下已经测试过的内容以及我卡在哪里。

https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/transforms-variable-substitution?view=azure-devops&tabs=Classic#json-variable-substitution

可以使用管道 -> 库 -> 变量组

或 Azure Key Vault 任务来获取机密值。

问题是秘密值不能包含点:

请提供一个有效的秘密名称。秘密名称只能包含 字母数字字符和破折号。

在链接的变量组或 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。

【问题讨论】:

    标签: azure azure-devops azure-keyvault


    【解决方案1】:

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

    创建了一个名为 ConnectionStrings.DefaultConnectionPipeline variable,它具有对我的链接变量组的引用值。

    如果我的秘密被命名为 ConnectionStringsDefaultConnection,我会将它作为链接变量连接起来,然后添加 $(ConnectionStringsDefaultConnection) 作为值。

    来源:

    https://stackoverflow.com/a/47787972/3850405

    【讨论】:

      【解决方案2】:

      其中一个选项是直接在您的应用程序中使用 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

      【讨论】:

        猜你喜欢
        • 2020-05-16
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多