Мне просто нужно это разъяснение для меня, может быть, у кого-то была похожая ситуация, и он нашел достойное решение.В настоящее время мы храним все наши конфиденциальные данные в 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 ------- ///
}
Итак, теперь мы перенесли многие из этих чувствительных настроек в Azure 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;
}
Будет ли это приемлемым решением?