无法读取.net core 2.1中的用户机密

问题描述 投票:0回答:4

我在尝试读取用户机密时遇到问题。我在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()为true。

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

c# json .net asp.net-core configuration
4个回答
1
投票

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

secrets.json
... .但它就是无法加载。

检查每个文件上的实际

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

当我接下来运行该项目时,我原来的

secrets.json
已加载......而不是空白的。

看来,如果您的项目文件夹中有

secrets.json
,这会覆盖由
Manage User Secrets
创建的文件,该文件在
C:\Users\<user>\AppData\Roaming\Microsoft\UserSecrets\<userSercretsId>

中创建它们

0
投票

我在测试项目中得到了这样的工作。 在 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"];
    
    
关于准备工作,我发现

这个有用的提示描述了您的项目的几个准备步骤。简而言之,您需要编辑 csproj 文件并且

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

0
投票
对我来说,问题源于设置配置的代码的位置。它不在代码入口点所在的程序集中,而是在不同的程序集中。 这意味着我必须改变

builder.AddUserSecrets(Assembly.GetExecutingAssembly(), true);

builder.AddUserSecrets(Assembly.GetEntryAssembly(), true);
    

-1
投票
尝试无误。 例如 builder.AddUserSecrets();

我也有同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.