Прочитайте секретное значение AzureKeyVault для настройки электронной почты - PullRequest
0 голосов
/ 09 января 2020

У меня есть модель для настройки электронной почты

public class EmailSettingsModel {
    public string MailServer { get; set; }
    public int MailPort { get; set; }
    public string SenderName { get; set; }
    public string Sender { get; set; }
    public string Password { get; set; }
}

Я поместил секретное значение в Azure Хранилище ключей

MailServer: smtp.gmail.com; MailPort: 587; SenderName: SenderName; Отправитель:. sender@gmail.com; Пароль: 123! 2019 #

В файле Startup.cs я помещаю свой код, регистрирую его во время выполнения:

public Startup(IConfiguration configuration) {
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services) {
    //this appSetting can return value from Azure Key Vault, the secret key.
    var appSetting = Configuration.GetValue<string>("AzureKeyVaultEmail");

    services.Configure<EmailSettingsModel>(Configuration.GetSection("AzureKeyVaultEmail"));
    services.AddSingleton<IEmailSender, EmailSender>();

    services.AddOptions();
    services.AddMvc();
}

Для инъекций в классе

public class EmailSender : IEmailSender
{
    private readonly EmailSettingsModel _emailSettings;

    public EmailSender (IOptions<EmailSettingsModel> emailSettings) {

        _emailSettings = emailSettings.Value;
    }
}

Но _emailSettings всегда null. Для _emailSettings предполагается, что возвращаемое значение

MailServer = smtp.gmail.com
MailPort = 587
SenderName = SenderName
Sender = the.sender@gmail.com
Password = 123!2019#

Почему _emailSettings всегда возвращает null? Я что-то пропустил? Я пытаюсь использовать этот в качестве ссылки

Ответы [ 2 ]

1 голос
/ 10 января 2020

В Startup.cs я использую приведенный ниже код для добавления EmailSettingsModel и добавления к сервисам:

services.AddSingleton<EmailSettingsModel>(sp =>
{
    var resultJson = Configuration.GetSection("<your secret name in kv>").Value;
    return JsonConvert.DeserializeObject<EmailSettingsModel>(resultJson);
});

А в HomeController:

public class HomeController : Controller
{
    private readonly EmailSettingsModel emailSender;
    public HomeController(EmailSettingsModel _emailSender)
    {
        emailSender = _emailSender;
    }
    public IActionResult Index()
    {
        var a = emailSender.MailServer ;
        return View();
    }
}

И вы получите значение ключа. Вы можете сослаться на этот SO поток .

1 голос
/ 09 января 2020

Из кода, упомянутого в вопросе, не было объяснено, если вы написали правильную конфигурацию для Azure хранилища ключей, которое будет чем-то стандартным, как показано ниже, надеюсь, вы добавили это.

var azureServiceTokenProvider = new AzureServiceTokenProvider();
                                var keyVaultClient = new KeyVaultClient(
                                    new KeyVaultClient.AuthenticationCallback(
                                        azureServiceTokenProvider.KeyVaultTokenCallback));

                                config.AddAzureKeyVault(
                                    vaultConfig.AzureVaultUrl,
                                    keyVaultClient,
                                    new DefaultKeyVaultSecretManager());

Также для чтения сложного объекта из хранилища ключей я бы предложил написать что-то вроде следующего:

services.AddSingleton<EmailSettingsModel >(sp =>
{
    var resultJson = Configuration.GetSection("AzureKeyVaultEmail").Value;
    return JsonConvert.DeserializeObject<EmailSettingsModel>(resultJson);
});

Также, как я вижу в этом вопросе, строка ниже не выглядит как валидат json формат:

MailServer:smtp.gmail.com; MailPort:587; SenderName:SenderName; Sender:the.sender@gmail.com; 

Пожалуйста, измените его в допустимом формате, и он должен работать.

Надеюсь, это поможет.

...