【发布时间】:2017-06-07 19:38:39
【问题描述】:
我走上了创建自己的ConfigurationProvider 的道路,它会加密尚未加密的文件,并且还能够解密它。
我现在正在努力想出一种方法,以与 .AddJsonFile() 类似的方式将我的解密 appsettings.json 内容(解密字符串)添加到配置中。
最终,我希望能够在我的Startup.cs 中调用.AddEncryptedJson("appsettings.json"),这将解密文件并添加所有必要的配置。
public class CustomConfigProvider : ConfigurationProvider, IConfigurationSource
{
private readonly RSA _pubKey;
private readonly RSA _privKey;
private readonly string _filePath;
public CustomConfigProvider(string filePath)
{
var cert = new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "certs", "IdentityServer4Auth.pfx"), "test");
_pubKey = RSACertificateExtensions.GetRSAPublicKey(cert);
_privKey = RSACertificateExtensions.GetRSAPrivateKey(cert);
_filePath = filePath;
}
public override void Load()
{
Data = UnencryptMyConfiguration();
}
private IDictionary<string, string> UnencryptMyConfiguration()
{
EncryptIfNotEncrypted();
var configFileBytes = File.ReadAllBytes(_filePath);
var decryptedData = _privKey.Decrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
var jsonString = Encoding.UTF8.GetString(decryptedData);
jsonString = jsonString.Trim(new char[] { '\uFEFF', '\u200B' });
dynamic result = JsonConvert.DeserializeObject(jsonString);
Dictionary<string, string> dictObj = result.ToObject<Dictionary<string, string>>();
return dictObj;
}
private void EncryptIfNotEncrypted()
{
var configFileBytes = File.ReadAllBytes(_filePath);
// Check if encrypted
try
{
_privKey.Decrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
}
catch
{
var encryptedData =
_pubKey.Encrypt(configFileBytes, RSAEncryptionPadding.Pkcs1);
using (var fs = new FileStream(_filePath, FileMode.Create, FileAccess.Write))
{
fs.Write(encryptedData, 0, encryptedData.Length);
}
}
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new CustomConfigProvider(_filePath);
}
}
public static class CustomConfigProviderExtensions
{
public static IConfigurationBuilder AddEncryptedJson(this IConfigurationBuilder builder, string filePath)
{
return builder.Add(new CustomConfigProvider(filePath));
}
}
【问题讨论】:
标签: c# configuration asp.net-core