我只需要对此澄清一下,也许有人遇到过类似的情况,并提出了一个不错的解决方案。 目前,我们将所有敏感数据存储在 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;
}
这是可以接受的解决方案吗?
答案 0 :(得分:0)
这是可以接受的解决方案吗?
是的。但是,您提供的CormarConfig
是一个类,也许某些方法很简洁。因此,我建议您在CormarConfig
类中添加一个CormarConfig
构造函数,如下所示:
public CormarConfig(ISecretProvider secretProvider) => _secretProvider = secretProvider;