【问题标题】:App Service integrated with Azure key vault - configuration inside an array与 Azure 密钥保管库集成的应用服务 - 阵列内的配置
【发布时间】:2020-09-01 08:21:55
【问题描述】:

我有一个安装在 Azure 应用服务中的 API,它是在 .Net Core 3.1 中制作的。 它与我们存储机密的 Azure 密钥保管库正确集成。 但是我们的 appsettings.json 中有一些敏感设置,我想将它们作为机密存储在 Key vault 中,这很容易通过使用配置路径设置密钥来实现,例如:

settings-someSetting-key

但问题是我的设置在一个数组中,如下所示:

{
"tenantSettings":[{
        "tenantId": 1,
        "repositories": [{
            "name": "repo1",
            "connectionString": "cs"
            },
            {
            "name": "repo2",
            "connectionString": "cs"
            }
        ]
    },
    {
        "tenantId": 2,
        "repositories": [{
            "name": "repo3",
            "connectionString": "cs"
            },
            {
            "name": "repo4",
            "connectionString": "cs"
            }
        ]
    }
]

}

因此,当我存储配置的路径以将密钥与设置匹配时,这无法正常工作,我也不知道该怎么做。

假设我要解析 repo1 连接字符串,路径应该是什么?

tenantSettings--repositories[0]--connectionString?

我无法完成这项工作,有人遇到过同样的情况吗?

【问题讨论】:

  • 路径是什么配置?该 blob 是您存储在 Azure Key Vault 机密中的内容吗?什么在处理配置文件和替换内容?需要更多信息,包括您要实现的目标的代码示例。

标签: azure azure-keyvault


【解决方案1】:

@Health 启动时我“插入”azure key vault:

var keyVaultEndpoint = Environment.GetEnvironmentVariable("KEYVAULT_ENDPOINT");

            if (string.IsNullOrEmpty(keyVaultEndpoint))
                throw new InvalidOperationException("Key vault not configured");

            string keyVaultReloadIntervalParameter = Environment.GetEnvironmentVariable("KEYVAULT_RELOADINTERVAL");

            TimeSpan? reloadInterval = null;
            int reloadIntervalValue = 0;

            if (int.TryParse(keyVaultReloadIntervalParameter, out reloadIntervalValue) && reloadIntervalValue > 0)
            {
                reloadInterval = TimeSpan.FromMinutes(reloadIntervalValue);
            }

            if (!string.IsNullOrEmpty(keyVaultEndpoint))
            {
                var azureServiceTokenProvider = new AzureServiceTokenProvider();

                var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

                configurationBuilder.AddAzureKeyVault(new AzureKeyVaultConfigurationOptions()
                {
                    Client = keyVaultClient,
                    Vault = keyVaultEndpoint,
                    ReloadInterval = reloadInterval,
                    Manager = new DefaultKeyVaultSecretManager()
                });
            }

在 ConfigureServices 上,我将配置设置读取为强类型表示:

services.Configure(this.Configuration.GetSection(nameof(ApplicationSettings)));

然后我在控制器上注入 ApplicationSettings 并执行以下操作:

applicationSettings.TenantSettings.First(t => t.TenantId == 1).Repositories.First(r => r.Name == "repo2");

通过设置密钥保管库并在密钥保管库上配置机密,设置会自动从密钥保管库加载到这种强类型表示中。

问题是秘密的名称是基于配置上数组的索引:

tenantSettings--0--repositories--0--connectionString

但根据我的经验,按索引匹配内容迟早可能会导致问题,假设有人在数组顶部添加了一个新设置。然后所有的保险库秘密都不匹配......所以我想知道是否有某种方式可以通过某个字段而不是索引进行匹配,如下所示:

tenantSettings:tenantId=1:repositories:name=repo1:connectionString

但是没有成功,有什么办法可以做到吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2022-12-03
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2016-10-13
    相关资源
    最近更新 更多