using Amazon;
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
namespace Amazon.SecretManager.Wrapper
{
///
/// Provides a simple implementation to fetch secrets from AWS Secrets Manager and return it as Dictionary of pair
///
public class SecretManagerProvider : ConfigurationProvider, IConfigurationSource
{
internal readonly string secretName;
internal readonly string region;
public SecretManagerProvider(string secretName)
{
this.secretName = secretName;
}
public SecretManagerProvider(string secretName, string region)
{
this.secretName = secretName;
this.region = region;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return this;
}
public override void Load()
{
try
{
Data = LoadConfiguration();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private IDictionary LoadConfiguration()
{
string encryptedText = "";
IAmazonSecretsManager client = !string.IsNullOrWhiteSpace(region) ? new AmazonSecretsManagerClient(RegionEndpoint.GetBySystemName(region)) : new AmazonSecretsManagerClient();
GetSecretValueRequest request = new GetSecretValueRequest
{
SecretId = secretName
};
var response = client.GetSecretValueAsync(request).GetAwaiter().GetResult();
if (response != null)
{
if (response.SecretString != null)
{
encryptedText = response.SecretString;
}
else
{
var memoryStream = response.SecretBinary;
using (StreamReader reader = new StreamReader(memoryStream))
{
string secretString = reader.ReadToEnd();
byte[] secretBinary = Convert.FromBase64String(secretString);
encryptedText = Encoding.UTF8.GetString(secretBinary);
}
}
}
return JsonConvert.DeserializeObject>(encryptedText);
}
}
}