代码之家  ›  专栏  ›  技术社区  ›  r3plica

c#配置类和密钥库

  •  0
  • r3plica  · 技术社区  · 5 年前

    我只需要澄清一下,也许有人遇到过类似的情况,并想出了一个像样的解决方案。 目前,我们将所有敏感数据存储在 应用程序设置 这不太好。 从我们使用的应用程序设置 自动传真 创造一个独生子女 配置 类,然后将其注入需要任何设置的任何类中。

    这就是该课程目前的样子:

    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 ------- ///
    
    }
    

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

    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;
        }
    }
    

    我已经测试过了,效果很好。 现在的问题是我该用什么来取代一些 属性 在我的 科马尔孔菲格

    例如,我想做如下事情:

    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;
    }
    

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Joey Cai    5 年前

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

    对然而 CormarConfig 你提供的是一个类,也许你提供的一些方法是简洁的。所以,我建议你加一个 科马尔孔菲格 中的构造函数 科马尔孔菲格 课程如下:

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