【问题标题】:Custom appsettings.json is not loaded未加载自定义 appsettings.json
【发布时间】:2018-05-07 09:54:06
【问题描述】:

我有一个 .net core 2.0 应用程序,有多个 appsettings 文件。我有 appsettings.json、appsettings.Development.json 和自定义 appsettings.Secure.json。

//appSettings.json

{
  "AzureAd" : {
    "ClientId" : "CID"
  }
}

//appSettings.Development.json
{
  "AzureAd" : {
   "Random" : "random2"
 } 
}

//appSettings.Secure.json
{
  "AzureAd" : {
    "ClientSecret" : "CSECRET"
  }
}

我总是希望加载我的 appSettings.Secure.json 配置。以下是 json 文件的配置方式。

 var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appSettings.json", optional : false)
                .AddJsonFile("appSettings.Development.json")
                .AddJsonFile("appsettings.Secure.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

问题是我的“AzureAd:ClientSecret”被加载到配置中(在配置对象的 Providers 部分中列出)但是当我注入 IOption 时,ClientSecret 属性为空。

AzureAdOptions是属性映射到的类,注册方式如下:

services.Configure<AzureAdOptions>(Configuration.GetSection("AzureAd"));

【问题讨论】:

  • 不直接相关,但是:I always want my appSettings.Secure.json configs to be loaded - 那你为什么将它指定为optional: true?根据需要标记它 => 至少当此文件不可读取时,您总是会遇到错误
  • 请显示AzureAdOptions类的定义
  • @Set public class AzureAdOptions { public string ClientId { get;放; } 公共字符串 ClientSecret { 获取;放; } 公共字符串实例 { 获取;放; } 公共字符串域 { 获取;放; } 公共字符串 TenantId { 获取;放; } 公共字符串 RedirectUrl { 获取;放; } 公共列表 权限 { 获取;放; } }

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


【解决方案1】:

JSON 在任何方面都不安全,尤其是考虑到这可能会提交给您的源代码控制。

appsettings.json 文件用于通用的、特定于环境的配置。然后,每个环境都应该有appsettings.{environment}.json 文件,但这些文件中的任何一个都不应包含任何秘密。在开发中,您可以利用 User Secrets 来存储您的秘密。在生产中,您应该使用 Azure Key Vault 和/或环境变量之类的东西来存储机密。

总之,你的appsettings.Secure.json 文件首先不应该存在。这不是环境,也不安全。

【讨论】:

  • 我们想要一种简单的方法来存储安全设置。但是,这个文件不会存储在源代码管理中,所以我们可以这样保存它。不过,有什么想法可以做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 2021-05-08
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多