2016-03-17 2 views
8

С уходом web.config, что является предпочтительным способом хранения конфиденциальной информации (паролей, токенов) в конфигурациях веб-приложения, созданного с использованием ASP.NET Core?Зашифрованная конфигурация в ASP.NET Core

Есть ли способ автоматически получить зашифрованные разделы конфигурации в appsetttings.json?

ответ

9

Секреты пользователей выглядят как хорошее решение для хранения паролей и, как правило, секретов приложений, не менее во время разработки.

Проверьте это article или this. Вы также можете проверить this другой вопрос.

Это всего лишь способ «скрыть» ваши секреты во время процесса разработки и избежать их раскрытия в исходное дерево; инструмент Secret Manager не шифрует сохраненные секреты и не должен рассматриваться как доверенный магазин.

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

Например:

public class CustomConfigProvider : ConfigurationProvider, IConfigurationSource 
    { 
     public CustomConfigProvider() 
     { 

     } 

     public override void Load() 
     { 
      Data = UnencryptMyConfiguration(); 
     } 

     private IDictionary<string, string> UnencryptMyConfiguration() 
     { 
      // do whatever you need to do here, for example load the file and unencrypt key by key 
      //Like: 
      var configValues = new Dictionary<string, string> 
      { 
       {"key1", "unencryptedValue1"}, 
       {"key2", "unencryptedValue2"} 
      }; 
      return configValues; 
     } 

     private IDictionary<string, string> CreateAndSaveDefaultValues(IDictionary<string, string> defaultDictionary) 
     { 
      var configValues = new Dictionary<string, string> 
      { 
       {"key1", "encryptedValue1"}, 
       {"key2", "encryptedValue2"} 
      }; 
      return configValues;     
     } 
     public IConfigurationProvider Build(IConfigurationBuilder builder) 
     { 
      return new CustomConfigProvider(); 
     } 
    } 

Определить статический класс для метода расширения:

public static class CustomConfigProviderExtensions 
{    
     public static IConfigurationBuilder AddEncryptedProvider(this IConfigurationBuilder builder) 
     { 
      return builder.Add(new CustomConfigProvider()); 
     } 
} 

И тогда вы можете активировать его:

// Set up configuration sources. 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json") 
      .AddEncryptedProvider() 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 
+0

У меня такая же проблема. можете ли вы завершить UnencryptMyConfiguration на основе вашего комментария? (например, загрузите файл и ключ незашифрования ключом) –

+0

Я разместил решение ниже, которое работает для меня, намного проще и идеально подходит для моих нужд. – CoderSteve

6

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

public class JsonConfigurationProvider2 : JsonConfigurationProvider 
{ 
    public JsonConfigurationProvider2(JsonConfigurationSource2 source) : base(source) 
    { 
    } 

    public override void Load(Stream stream) 
    { 
     // Let the base class do the heavy lifting. 
     base.Load(stream); 

     // Do decryption here, you can tap into the Data property like so: 

     Data["abc:password"] = MyEncryptionLibrary.Decrypt(Data["abc:password"]); 

     // But you have to make your own MyEncryptionLibrary, not included here 
    } 
} 

public class JsonConfigurationSource2 : JsonConfigurationSource 
{ 
    public override IConfigurationProvider Build(IConfigurationBuilder builder) 
    { 
     EnsureDefaults(builder); 
     return new JsonConfigurationProvider2(this); 
    } 
} 

public static class JsonConfigurationExtensions2 
{ 
    public static IConfigurationBuilder AddJsonFile2(this IConfigurationBuilder builder, string path, bool optional, 
     bool reloadOnChange) 
    { 
     if (builder == null) 
     { 
      throw new ArgumentNullException(nameof(builder)); 
     } 
     if (string.IsNullOrEmpty(path)) 
     { 
      throw new ArgumentException("File path must be a non-empty string."); 
     } 

     var source = new JsonConfigurationSource2 
     { 
      FileProvider = null, 
      Path = path, 
      Optional = optional, 
      ReloadOnChange = reloadOnChange 
     }; 

     source.ResolveFileProvider(); 
     builder.Add(source); 
     return builder; 
    } 
} 
+0

Конечно помог мне. Большое спасибо. – ashilon

+0

Какой метод шифрования будет лучше? – ssug89

+0

Помог мне. Благодаря! – blogs4t

Смежные вопросы