繁体   English   中英

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

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

我在 azure 的密钥库密钥中有一个 object 值,并尝试在启动 class 时读取该值,但该值始终为 Z3079A62586CC0C19。

程序.cs

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

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

启动.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值始终为 null。

这是我的 azure 密钥库值

在此处输入图像描述

Json 结构的密钥秘密值

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

视图模型.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"] 代码,我可以获得该值,但我想为此进行依赖注入。

我做了一个快速测试,这是我的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);
});

controller 中的代码:

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

结果:

在此处输入图像描述

希望能帮助到你。

您希望将 KeyVault 中的键/值 map 转换为嵌套配置,这是不可能的。 默认情况下,所有机密都写入根配置。 但是,netcore 中的IConfiguration实现具有如何实现这一点的功能。 例如,当您设置键“Section1:Key1”时,会设置“Section1”键“Key1”。

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

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

这篇文章是关于这个主题的非常好的信息来源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM