2016-03-17 36 views
8

web.config ile birlikte, ASP.NET Çekirdeği kullanılarak oluşturulan bir web uygulamasının yapılandırmalarında hassas bilgileri (parolalar, belirteçler) depolamanın tercih edilen yolu nedir?ASP.NET Çekirdeğinde Şifreli Yapılandırma

appsetttings.json'da şifreli yapılandırma bölümlerini otomatik olarak almanın bir yolu var mı?

cevap

9

Kullanıcı sırları, şifreleri saklamak için iyi bir çözüm ve genellikle uygulama sırları, numaralı geliştirme sırasında en az gibi görünüyor.

Bu article veya this'u kontrol edin. this diğer SO sorusunu da kontrol edebilirsiniz.

Bu, geliştirme sürecinde sırlarınızı "gizlemenin" ve onları kaynak ağaca kapatmamanın bir yoludur; Gizli Yönetici aracı saklanan sırları şifrelemez ve güvenilir bir mağaza olarak ele alınmamalıdır.

Şifrelenmiş bir appsettings.json'u üretime getirmek isterseniz, bununla ilgili bir sınırlama yoktur. Özel yapılandırma sağlayıcınızı oluşturabilirsiniz. this'u kontrol edin.

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

Uzantınız yöntemi için statik bir sınıf tanımlamak:

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

Sonra da onu etkinleştirebilirsiniz:

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

Aynı problemim var. UnencryptMyConfiguration'u yorumunuza göre tamamlayabilir misiniz? (örneğin dosyayı yükle ve anahtarı anahtarını aç) –

+0

Benim için çalışacak bir çözüm gönderdim, ihtiyaçlar için çok daha basit ve mükemmel. – CoderSteve

6

ben istemedim Örneğin

Özel bir sağlayıcı yaz - çok fazla çalışma. Sadece JsonConfigurationProvider'a girmek istedim, bu yüzden benim için çalışan bir yol buldum, umarım birilerine yardım eder.

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

Elbette bana yardımcı oldu. Çok teşekkürler. – ashilon

+0

Hangi şifreleme yöntemi daha iyi olacak? – ssug89

+0

Yardım ettim. Teşekkürler! – blogs4t

İlgili konular