问题描述
我在 Azure 中有一个 Kentico Xperience (v13) 实例,我想运行 ContinuousIntegration.exe
以使用我的 CI xml 文件中的内容填充我的数据库。问题是我们正在将 CMSConnectionString
设置从 Azure Key Vault (AKV) 注入 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 开始,以下是配置它的步骤:
- 按照此处的步骤将 Key Vault 支持添加到本地管理应用:https://docs.microsoft.com/en-us/azure/key-vault/general/vs-key-vault-add-connected-service。
- 将上述模块添加到类库中的解决方案中。确保主项目引用类库,以便在构建过程中包含它。
- 确保 ~\web.config 没有名为 CMSConnectionString 的连接字符串或应用设置。
- 将应用部署到应用服务。
- 在 Azure 中,使用名称 CMSConnectionString 和值 @Microsoft.KeyVault(VaultName=your-keyvault;SecretName=CMSConnectionString) 创建应用服务配置设置。
- 在 Key Vault 中,创建一个名为 CMSConnectionString 的机密,并为 Azure SQL 数据库的连接字符串赋值。您可能还需要遵循 https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references 为我的应用服务创建访问策略。
- 此时,Kentico Xperience 13 管理员应该可以访问数据库。
- 在应用服务门户中,在开发工具下选择控制台。
- 在控制台中,运行
cd bin
,然后运行 ContinuousIntegration.exe -r
。这应该会生成一条关于未配置存储库的消息,或者在恢复操作上输出。