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

问题描述 投票:0回答:2

我有用于电子邮件设置的模型

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;发件人:[email protected];密码: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 = [email protected]
Password = 123!2019#

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

c# asp.net-core-2.2 azure-keyvault
2个回答
0
投票

从问题中提到的代码开始,如果您已经为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:[email protected]; 

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

希望有帮助。


0
投票

在Startup.cs中,我使用下面的代码注入EmailSettingsModel并添加到服务中:

© www.soinside.com 2019 - 2024. All rights reserved.