c#配置类和KeyVault

时间:2019-02-21 13:58:57

标签: c# configuration azure-keyvault

我只需要对此澄清一下,也许有人遇到过类似的情况,并提出了一个不错的解决方案。 目前,我们将所有敏感数据存储在 ApplicationSettings 中,但这并不好。 从应用程序设置中,我们使用 Autofac 创建单例 Configuration 类,然后将其注入需要任何设置的任何类中。

这是当前班级的样子:

public class CormarConfig : ICormarConfig
{
    public bool Live => ConfigurationManager.AppSettings["Server"].ToUpper().Equals("LIVE");
    public string SqlConnectionString => ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
    public string OracleConnectionString => ConfigurationManager.ConnectionStrings["OracleConnection"].ToString();

    public connectionType ConnectionType => Live ? connectionType.Live : connectionType.Test;
    public string CollectionManagerEndpoint => ConfigurationManager.AppSettings["CollectionManagerEndpoint"];
    public string TradePortalUrl => ConfigurationManager.AppSettings["TradePortalUrl"];
    public string TroposDb => ConfigurationManager.AppSettings["TroposDatabase" ];
    public string WmsBaseEndpoint => ConfigurationManager.AppSettings["WmsBaseEndpoint"];

    /// ------- Removed from brevity ------- ///

}

因此,现在我们将许多敏感设置转移到了很好的 Key Vault 中。然后,我创建了一个简单的类来检索这些“秘密”,如下所示:

public class SecretProvider : ISecretProvider
{
    private readonly KeyVaultClient _keyVaultClient;
    private readonly ISecretConfig _config;

    public SecretProvider(ISecretConfig config)
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        _keyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
        _config = config;
    } 

    public async Task<string> GetAsync(string name)
    {
        var secret = await _keyVaultClient.GetSecretAsync($"{_config.KeyVaultEndPoint}/secrets/{name}");
        return secret.Value;
    }
}

我已经对此进行了测试,并且效果很好。 问题是我现在要替换我的 CormarConfig 类中的某些属性

例如,我想做类似的事情:

private readonly ISecretProvider _secretProvider;
public CormarConfig(ISecretProvider secretProvider) => _secretProvider = secretProvider;

private string _sqlConnectionString;
public async Task<string> GetSqlConnectionString()
{
    if (!string.IsNullOrEmpty(_sqlConnectionString)) return _sqlConnectionString;
    _sqlConnectionString = await _secretProvider.GetAsync("DefaultConnection");
    return _sqlConnectionString;
}

这是可以接受的解决方案吗?

1 个答案:

答案 0 :(得分:0)

  

这是可以接受的解决方案吗?

是的。但是,您提供的CormarConfig是一个类,也许某些方法很简洁。因此,我建议您在CormarConfig类中添加一个CormarConfig构造函数,如下所示:

public CormarConfig(ISecretProvider secretProvider) => _secretProvider = secretProvider;