我只需要澄清一下,也许有人遇到过类似的情况,并想出了一个像样的解决方案。
目前,我们将所有敏感数据存储在
应用程序设置
这不太好。
从我们使用的应用程序设置
自动传真
创造一个独生子女
配置
类,然后将其注入需要任何设置的任何类中。
这就是该课程目前的样子:
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;
}
这是一个可以接受的解决方案吗?