【问题标题】:Reading a configuration section from JSON and environment variables gives different results从 JSON 和环境变量中读取配置部分会给出不同的结果
【发布时间】:2018-01-26 02:44:07
【问题描述】:

我正在尝试了解 .NET Core 2 中的配置源。我有一些秘密配置,在我的开发环境中存储在项目 secrets.json 中。因为我不希望这些秘密存在于存储库中,所以在生产中我想从环境变量中加载它们。我的理解是ConfigurationBuilder 可以让我交替使用配置源,但它们的加载方式不同。

我的secrets.json 文件看起来有点像这样:

{
  "MyApi" : {
    "APIKEY": "12341234123412341234",
    "TemplateIds": {
      "MyTemplate": "abcdabcdabcdabcdabcdabcd"
    }
  }
}

这会加载builder.GetSection("MyApi").AsEnumerable(),作为包含以下项目的列表:

{[MyApi, ]}
{[MyApi:APIKEY, "12341234123412341234"]}
{[MyApi:TemplateIds, ]}
{[MyApi:TemplateIds:MyTemplate, "abcdabcdabcdabcdabcdabcd"]}

但是,当我将名为 MyApi 的环境变量设置为 {"APIKEY": "12341234123412341234", "TemplateIds": {"MyTemplate": "abcdabcdabcdabcdabcdabcd"} 时,使用 builder.GetSection("MyApi").AsEnumerable() 加载它只会产生一个值,设置为整个 JSON 字符串。

我的配置生成器如下所示:

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("secrets/appsettings.secrets.json", optional: true)
    .AddEnvironmentVariables();

那么,这两种加载配置的方法是否应该给出相同的结果,如果是,有谁知道为什么在这种情况下它们可能会有所不同?

【问题讨论】:

  • 好问题!我也觉得很混乱。人们一直在阅读有关配置链的信息,这使您相信这些值只是被覆盖了 appsettings->appsettings.dev-> 环境变量。但是由于您没有统一访问它们,我会说这并不正确

标签: asp.net-core configuration .net-core environment-variables


【解决方案1】:

这是因为环境变量提供程序不处理 JSON。如果要通过环境变量指定这些设置,则需要将每个设置设置为自己的环境变量。例如,对于APIKEY,您需要一个名为MyApi.APIKEY 的环境变量,其值为12341234123412341234。冲洗并重复其余设置。您需要通过将每个级别与 .: 连接在一起来表示 JSON 中存在的层次结构。

也就是说,与其创建secrets.json 之类的东西,您应该使用用户机密。它的工作方式几乎相同,它也是 JSON,但它完全从您的项目中抽象出来,因此没有您必须忽略的文件,也没有最终可能最终提交的文件。

另外,对于它的价值,您的所有设置都应该在appsettings.json 或特定于环境的版本之一中。对于“秘密”,只需放入占位符或空值。然后可以通过更具体的配置(如用户机密、环境变量、Azure KeyVault 等)覆盖它。这样,您的应用所需的所有配置都记录在 签入源代码控制的内容中,但是实际的秘密值不是。否则,可能需要使用该应用程序的其他开发人员很难知道他们需要提供哪些设置。例如:

{
  "MyApi" : {
    "APIKEY": "***SET IN USER SECRETS OR ENVIRONMENT VARIABLE***",
    "TemplateIds": {
      "MyTemplate": "abcdabcdabcdabcdabcdabcd"
    }
  }
}

【讨论】:

  • 谢谢克里斯。从示例中并不清楚提供程序根本不处理 JSON。不幸的是,我们有大量的秘密配置,因此将其拆分为单独的环境变量将是一个巨大的开销。我们的生产环境至少可以说是古怪的,所以看起来它会有点横向思考!
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2019-08-27
  • 2019-06-26
  • 2019-11-27
  • 2021-02-26
  • 2017-03-06
  • 1970-01-01
相关资源
最近更新 更多