如何从最低值读取配置值

时间:2018-09-07 07:35:42

标签: c# asp.net-core asp.net-core-2.0

我正在尝试为我的应用程序提供一些配置数据,以便我们在源代码控件中存储了简单的设置,但是部署系统将在部署时替换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 :(得分:1)

似乎您的配置注册错误。将使用包含特定密钥的最后一个注册。

例如,在您的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.jsonappsettings.json提供的值。

来自the docs

  

按照在启动时指定其配置提供程序的顺序读取配置源。本主题中描述的配置提供程序以字母顺序描述,而不是以您的代码排列它们的顺序。对代码中的配置提供程序进行排序,以适合基础配置源的优先级。

     

典型的配置提供程序顺序为:

     
      
  • 文件(appsettings.json,appsettings..json,该应用程序的当前托管环境在哪里)
  •   
  • 用户机密(秘密管理器)(仅在开发环境中)
  •   
  • 环境变量
  •   
  • 命令行参数
  •   
     

通常的做法是将命令行配置提供程序放置在一系列提供程序的最后,以允许命令行参数覆盖其他提供程序设置的配置。

答案 1 :(得分:0)

您可以在Startup.cs中使用方法ConfigureServices(IServiceCollection services)

在类中描述您的设置属性并将其绑定。例如:

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