读取电子邮件设置的 AzureKeyVault 机密值

Read AzureKeyVault secret value 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; }
}

我将秘密值放入 Azure Key vault

MailServer:smtp.gmail.com; MailPort:587; SenderName:SenderName; Sender:the.sender@gmail.com; Password: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();
}

注射 class

public class EmailSender : IEmailSender
{
    private readonly EmailSettingsModel _emailSettings;

    public EmailSender (IOptions<EmailSettingsModel> emailSettings) {

        _emailSettings = emailSettings.Value;
    }
}

但是 _emailSettings 总是 null。对于“_emailSettings”,它假设 return 值

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

为什么 _emailSettings 总是 return null?我想念什么吗? 我尝试使用 作为参考

从问题中提到的代码来看,没有解释您是否为 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; 

请以有效格式更改它,它应该可以工作。

希望对您有所帮助。

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

您将获得密钥保管库值。你可以参考这个 .