Попытка получить доступ к значению объекта из хранилища ключей Azure в ядре Asp.net - PullRequest
0 голосов
/ 10 октября 2019

У меня есть значение объекта в ключе хранилища ключей Azure, и я пытаюсь прочитать значение в классе запуска, но значение всегда равно нулю.

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

enter image description here

Структура секретного значения ключа 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"] я могу получить значение, но я хочу сделать внедрение зависимости для этого.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я сделал быстрый тест на моей стороне, это мой OktaConfig для быстрого теста:

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

Секрет в хранилище ключей:

enter image description here

Остальной код такой же, как и у вас. Но в 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);
}

Результат:

enter image description here

Надеюсь, это поможет.

0 голосов
/ 10 октября 2019

Вы хотите отобразить ключ / значение из KeyVault во вложенную конфигурацию, что невозможно. По умолчанию все секреты записываются в корневую конфигурацию. Тем не менее, реализация IConfiguration в netcore имеет функцию, как этого добиться. Например, когда вы устанавливаете ключ «Section1: Key1», ключ «Section1» раздела «Key1» устанавливается.

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

Теперь вам нужно только записать конфигурацию из KeyVault в объект конфигурации в этом формате. Класс DefaultKeyVaultSecretManager может сделать это преобразование за вас, просто сохраните ключ в KeyVault в соответствующем формате. Просто напишите разделитель '-' вместо ':' В моем примере вы бы использовали 'Section1 - Key1'.

Эта статья является очень хорошим источником информации по этой теме.

...