尝试从 Asp.net 核心中的 Azure 密钥保管库访问对象值

Trying to access the object value from Azure key vault in Asp.net core

我在 Azure 的密钥保管库密钥中有一个对象值,并试图在启动时读取该值 class 但该值始终为空。

Program.cs

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

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

Startup.cs

public virtual void ConfigureSettings(IServiceCollection services)
    {
        services.AddOptions();
        services.Configure<OktaConfig>(Configuration.GetSection("OktaConfig")); // Read the value from Azure Key Vault or %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json for Dev Environment
    }

Controller.cs

 public class SystemController
    {

        private readonly IConfiguration _config;
        private readonly OktaConfig _oktaConfig;

        public SystemController(IConfiguration config, IOptions<OktaConfig> oktaConfig)
        {
            _config = config;
            _oktaConfig = oktaConfig.Value; // This value is null
        }        


        [HttpGet("Vaults")]
        public IActionResult GetVaultValues()
        {
            var OktaConfig = JsonConvert.DeserializeObject<OktaConfig>(_config["OktaConfig"]);
            return Ok(OktaConfig);
        }

_oktaConfig 值始终为空。

这是我的 Azure Key Vault 值

Json密钥秘密值的结构

{
        "OktaDomain": "https://dev-166545.okta.com/oauth2/XXXXXXXXXXXXXXXXX/v1/authorize",
        "ClientId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
        "ClientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "redirectUrl": "https://localhost:44307"
    }

ViewModel.cs

public class OktaConfig
    {
        public string RedirectUrl { get; set; }
        public string OktaDomain { get; set; }
        public string ClientId { get; set; }
        public string ClientSecret { get; set; }
        public string ClientName { get; set; }
    }

使用这个 _config["OktaConfig"] 代码我可以得到这个值,但我想为此做依赖注入。

您想将 key/value 从 KeyVault 映射到嵌套配置,这是不可能的。默认情况下,所有机密都写入根配置。但是,netcore 中的 IConfiguration 实现具有如何实现此功能的功能。 例如,当您设置键 "Section1:Key1" 时,部分 "Section1" 键 'Key1' 被设置。

Configuration["Section1:Key1"]="value"
var section1 = Configuration.GetSection("Section1");

现在只需要将KeyVault中的配置以这种格式写入Configuration对象即可。 DefaultKeyVaultSecretManager class 可以为您完成此转换,只需将密钥以适当的格式保存在 KeyVault 中即可。只需写分隔符 '--' 而不是 ':' 在我的示例中,您将使用 'Section1--Key1'.

This article 是有关此主题的非常好的信息来源。

我在我这边做了一个快速测试,这是我的OktaConfig快速测试:

public class OktaConfig
{
    public string RedirectUrl { get; set; }   
}

密钥库中的秘密:

其他代码和你一样。但是在 Startup.cs 中,我使用下面的代码注入 OktaConfig 并添加到 services:

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

控制器中的代码:

private readonly ILogger<HomeController> _logger;
private OktaConfig oktaConfig;

public HomeController(ILogger<HomeController> logger , OktaConfig oktaConfig)
{
    this.oktaConfig = oktaConfig;
    _logger = logger;
}

public IActionResult Index()
{
    return Ok(oktaConfig.RedirectUrl);
}

结果:

希望对您有所帮助。