Как прочитать значение конфигурации из значения самого низкого уровня - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь предоставить некоторые данные конфигурации для моего приложения, чтобы в элементе управления исходным кодом были сохранены простые настройки, но наша система развертывания заменит ключ шифрования в appsettings.json при развертывании.

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

У меня есть мои файлы конфигурации, настроенные так:

appsettings.json

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "weak"
  }
}

appsettings.Development.json

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "devweak"
  }
}

В моих секретах пользователя

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "this is a secret"
  }
}

В моей конструкции контроллера я получаю инъекцию IConfiguration configuration.

А потом

 public SysConfigController(IConfiguration configuration)
 {
     var result = configuration["SystemConfiguration:EncryptionKey"];
 }

но значение результата всегда "слабое", если только файлы настроек более высокого уровня вообще не содержат значения (: null), также не работает.

Есть ли способ получить значение самого низкого уровня?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Кажется, что ваши настройки конфигурации неверны. Будет использована последняя регистрация, которая содержит конкретный ключ.

Например, в вашем файле Program.cs (при условии, что вы используете ASP.NET Core, в противном случае конструктор Startup.cs для ASP.NET Core 1.x) вы можете переопределить регистрации (или просто добавить те, которые вам нравятся). когда вы используете метод хоста по умолчанию):

public static IWebHostBuilder BuildWebHost(string[] args) =>
    new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddUserSecrets<Startup>()
                .AddEnvironmentVariables()
                .AddCommandLine(args);
        })
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights();

В этом примере были зарегистрированы следующие

  • .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true): Глобальный конфигурационный файл
  • .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) Конфигурационный файл для конкретной среды, т. Е. appsettings.Development.json
  • .AddUserSecrets<Startup>() Пользовательские секреты
  • .AddEnvironmentVariables() Переменные среды
  • .AddCommandLine(args); Параметры командной строки

При поиске ключа поиск происходит в обратном порядке. Если он определен как параметр командной строки, он переопределит все остальные ключи и значения (из переменной среды, пользовательских секретов, среды и глобального файла).

Итак, поместите наименее важный файл в начале, а самый важный (перезаписывающий) в конце.

В этом случае, если оно определено в ваших пользовательских секретах, оно переопределит значения appsettings.Development.json и appsettings.json.

С документы

Источники конфигурации читаются в том порядке, в котором их поставщики конфигурации указаны при запуске. Поставщики конфигурации, описанные в этом разделе, описаны в алфавитном порядке, а не в том порядке, в котором ваш код может их упорядочить. Закажите поставщиков конфигурации в своем коде, чтобы они соответствовали вашим приоритетам для базовых источников конфигурации.

Типичная последовательность поставщиков конфигурации:

  • Файлы (appsettings.json, appsettings..json, где находится текущая среда размещения приложения)
  • Секреты пользователя (Secret Manager) (только в среде разработки)
  • Переменные среды
  • Аргументы командной строки

Обычной практикой является размещение поставщика конфигурации командной строки последним в ряду поставщиков, чтобы аргументы командной строки могли переопределять конфигурацию, установленную другими поставщиками.

0 голосов
/ 07 сентября 2018

Вы можете использовать метод ConfigureServices(IServiceCollection services) в Startup.cs.

Опишите свое свойство настройки в классе и привяжите его. Например:

services.Configure<SystemConfiguration>(options => Configuration.GetSection("SystemConfiguration").Bind(options));

public class SystemConfiguration
{
   public string EncryptionKey{get;set;}
}

Затем вы можете использовать DI для получения класса

public class SomeClass
{
   private readonly SystemConfiguration _systemConfiguration{get;set;}
   public SomeClass (IOptions<ConfigExternalService> systemConfiguration)
   {
    _systemConfiguration = systemConfiguration;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...