如何在通过Azure Key Vault配置.NET时转义点号
问题描述
我需要通过Azure Key Vault覆盖应用的Serilog配置,原配置如下:
{ "Serilog": { "MinimumLevel": { "Override": { "Microsoft.EntityFrameworkCore.Database.Command": "Warning" } } } }
配置层级要求用--分隔,但Azure Key Vault不允许密钥名称中使用点号,无法正确识别Microsoft.EntityFrameworkCore.Database.Command这个命名空间。我尝试用问号替代点号(比如Serilog--MinimumLevel--Override--Microsoft?EntityFrameworkCore?Database?Command),但无法生效,请问有什么解决办法?
可行解决方案
方案1:双下划线替代点号+自定义配置映射
Azure Key Vault允许使用下划线,你可以将原配置中的点号替换为双下划线,同时在应用加载配置时添加转换规则:
- 在Azure Key Vault中创建秘密,名称设为:
秘密值设为Serilog--MinimumLevel--Override--Microsoft__EntityFrameworkCore__Database__CommandWarning - 在.NET应用的配置加载代码中,自定义
KeyVaultSecretManager来处理层级和点号的转换:builder.Configuration.AddAzureKeyVault( new Uri("https://your-vault-name.vault.azure.net/"), new DefaultAzureCredential(), new CustomKeyVaultSecretManager()); public class CustomKeyVaultSecretManager : IKeyVaultSecretManager { public bool Load(SecretProperties properties) => true; public string GetKey(KeyVaultSecret secret) { // 将--替换为配置层级分隔符冒号,将__替换为原配置中的点号 return secret.Name.Replace("--", ":").Replace("__", "."); } }
方案2:通过Azure App Configuration中转(若使用该服务)
如果你的应用集成了Azure App Configuration,可以直接在App Configuration中创建密钥Serilog:MinimumLevel:Override:Microsoft.EntityFrameworkCore.Database.Command,然后将该密钥关联到Azure Key Vault的对应秘密。App Configuration会自动处理层级映射,无需修改Key Vault的秘密名称。
方案3:直接使用冒号作为层级分隔符
部分框架支持用冒号:作为配置层级分隔符,你可以尝试在Azure Key Vault中创建名称为Serilog:MinimumLevel:Override:Microsoft__EntityFrameworkCore__Database__Command的秘密,然后在配置加载时启用对应解析规则,框架会自动识别层级并替换双下划线为点号。
内容的提问来源于stack exchange,提问作者Uriil

