如何允许 ContinuousIntegration.exe 在 Azure Key Vault 中使用连接字符串

How do I allow ContinuousIntegration.exe to use a connection string in Azure Key Vault

我在 Azure 中有一个 Kentico Xperience (v13) 实例,我想 运行 ContinuousIntegration.exe 用我的 CI [=27] 中的内容填充我的数据库=] 文件。问题是我们正在从 Azure Key Vault (AKV) 将 CMSConnectionString 设置注入 Web 应用程序,而 CI.exe 没有看到它。相反,我收到此错误消息:

CMS.DataEngine.ApplicationInitException: Cannot access the database specified by the 'CMSConnectionString' connection string. Please install the database externally and set a correct connection string.

或者这个错误信息:

Failed to execute the command.

这是我们 web.config 的相关部分(适用于网站!):

<connectionStrings>
  <!--Should be provided by Azure Key Vault-->
</connectionStrings>

如何确保可执行文件能够访问 AKV 中的秘密?

可以让 ContinuousIntegration.exe 使用一个在启动时设置连接字符串的小型自定义模块来了解安全连接字符串。这是模块的基本代码:

[assembly: AssemblyDiscoverable]
[assembly: RegisterModule(typeof(AzureConnectionStringModule))]

public class AzureConnectionStringModule : Module
{
    public AzureConnectionStringModule()
        : base(nameof(AzureConnectionStringModule))
    {
    }

    protected override void OnPreInit()
    {
        base.OnPreInit();

        var azureConnectionString = Environment.GetEnvironmentVariable("SQLAZURECONNSTR_CMSConnectionString");

        if (string.IsNullOrWhiteSpace(azureConnectionString))
        {
            azureConnectionString = Environment.GetEnvironmentVariable("CMSConnectionString");
        }

        if (!string.IsNullOrWhiteSpace(azureConnectionString))
        {
            SettingsHelper.ConnectionStrings.SetConnectionString("CMSConnectionString", azureConnectionString);
        }
    }
}

从全新安装的 Kentico Xperience 13 开始,配置步骤如下:

  1. 按照此处的步骤在本地向管理应用添加 Key Vault 支持:https://docs.microsoft.com/en-us/azure/key-vault/general/vs-key-vault-add-connected-service
  2. 将上述模块添加到 class 库中的解决方案中。确保主项目引用 class 库,以便在构建过程中包含它。
  3. 确保 ~\web.config 没有名为 CMSConnectionString 的连接字符串或应用程序设置。
  4. 将应用部署到应用服务。
  5. 在 Azure 中,使用名称 CMSConnectionString 和值 @Microsoft.KeyVault(VaultName=your-keyvault;SecretName=CMSConnectionString ).
  6. 在 Key Vault 中,创建一个名称为 CMSConnectionString 的机密,并为 Azure SQL 数据库的连接字符串赋值。您可能还需要按照 https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references 为我的应用服务创建访问策略。
  7. 此时,Kentico Xperience 13 管理员应该加载了对数据库的访问权限。
  8. 在应用服务门户中,开发工具 select 控制台.
  9. 在控制台中,运行 cd bin 然后是 ContinuousIntegration.exe -r。这应该会产生一条关于存储库未配置的消息,或者在恢复操作时输出。