Search code examples
c#asp.net-core-2.2azure-keyvault

Read AzureKeyVault secret value for email setting


I have model for email setting

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; }
}

I put secret value in Azure Key vault

MailServer:smtp.gmail.com; MailPort:587; SenderName:SenderName; Sender:[email protected]; Password:123!2019#

In the Startup.cs file, I put my code, register it with the run time:

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();
}

For injection in class

public class EmailSender : IEmailSender
{
    private readonly EmailSettingsModel _emailSettings;

    public EmailSender (IOptions<EmailSettingsModel> emailSettings) {

        _emailSettings = emailSettings.Value;
    }
}

But _emailSettings always null. For '_emailSettings', it suppose return value

MailServer = smtp.gmail.com
MailPort = 587
SenderName = SenderName
Sender = [email protected]
Password = 123!2019#

Why _emailSettings always return null ? Do I miss something ? I try to use this as reference


Solution

  • In Startup.cs , I use the code below to inject EmailSettingsModel and add to services:

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

    And in HomeController:

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

    And you will get the keyvault value. You could refer to this SO thread.