【问题标题】:Cannot read user secrets in .net core 2.1无法在 .net core 2.1 中读取用户机密
【发布时间】:2018-06-27 11:50:32
【问题描述】:

我在尝试读取用户机密时遇到问题。我在startup.cs中的代码如下:

 public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json",
                    optional: false,
                    reloadOnChange: true);

            if (env.IsDevelopment())
            {
                builder.AddUserSecrets<Startup>(false);
            }

            builder.AddEnvironmentVariables();
            Configuration = builder.Build();
        }

从 appsettings.json 和环境变量读取工作正常,但无论我在 secrets.json 文件中放入什么,都不会从中读取任何值。项目文件中UserSecretsId的值正确,env.IsDevelopment()为真。

配置包含三个提供程序。一个 JsonConfigurationProvider 包含来自 appsettings.json 的数据,一个 EnvironmentVariablesConfigurationProvider 包含来自环境变量的值,一个 JsonConfigurationProvider 没有数据。我认为后一个是添加用户机密的那个。但是为什么是空的呢?

【问题讨论】:

  • 您是如何创建secrets.json 的?它存储在哪里?
  • 我正在通过 VS 2017 创建它。它存储在 %APPDATA%\Microsoft\UserSecrets\\secrets.json 中。 user_secrets_id 的值与项目文件中的值匹配。
  • 该文件是有效的 JSON 格式吗?

标签: asp.net-core configuration


【解决方案1】:

我不得不将一个项目分成两部分,但我终生无法将秘密加载到生成的项目中,它具有完全相同的项目环境,包括 VS2017 项目树中的secrets.json。 ...但它不会加载。

在检查每个实际的.csproj 文件时,唯一的区别是生成的项目没有UserSecretsId 条目,所以我只需右键单击该项目,点击Manage User Secrets 然后关闭随后的 Json 编辑器,无需修改。

当我接下来运行该项目时,我原来的secrets.json 已加载...不是空白的。

如果您的项目文件夹中有secrets.json,这似乎会覆盖由Manage User Secrets 创建的文件,后者在C:\Users\&lt;user&gt;\AppData\Roaming\Microsoft\UserSecrets\&lt;userSercretsId&gt; 中创建它们

【讨论】:

    【解决方案2】:

    我在一个测试项目中让它像这样工作。 在 Startup.cs 中,我做了:

        internal IConfigurationRoot Configuration { get; private set;  }
    
        public override void ConfigureTestServices(ref IServiceCollection services)
        {        
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json",
                    optional: false,
                    reloadOnChange: true);
            builder.AddUserSecrets<Startup>(false);
            builder.AddEnvironmentVariables();
            Configuration = builder.Build();
            services.AddScoped<IConfigurationRoot>(option => Configuration);
        
    
          // ... more settings
        }
    
    1. 配置文件中,你可以简单地通过

           var secretValue = Configuration["SomeUserSecret"];
      
    2. 外部,在您的测试类中,您通过指定使用依赖注入 IConfigurationRoot config 在您的构造函数中并将配置分配给类属性,然后像

      一样访问它
           var secretValue = config["SomeUserSecret"];
      

    关于准备工作,我发现this useful hint 描述了您项目的几个准备步骤。简而言之,您需要编辑csproj文件并

    • 在 TargetFramework 下添加&lt;UserSecretsId&gt;Insert New Guid Here&lt;/UserSecretsId&gt;
    • 在项目组中添加&lt;DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0"/&gt;
    • 重新加载 csproj 文件 - 然后您可以右键单击它并选择“管理用户机密”,这将为您创建 secrets.json 文件。

    【讨论】:

      【解决方案3】:

      尝试不假。 例如 builder.AddUserSecrets();

      我遇到了同样的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 2019-02-10
        相关资源
        最近更新 更多