繁体   English   中英

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

[英]Cannot read user secrets in .net core 2.1

我在尝试读取用户机密时遇到问题。 我在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 没有数据。 我认为后一个是添加用户机密的那个。 但为什么是空的?

我有一个项目分成两个部分,但我不能为我的生命得到了秘密的衍生项目加载,它有完全相同的项目环境,包括secrets.json在VS2017项目树....但它不会加载。

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

当我接下来运行项目时,我的原始secrets.json被加载了......而不是空白的。

看来,如果你的项目文件夹中有secrets.json ,这会覆盖由Manage User Secrets创建的文件,这些文件在C:\\Users\\<user>\\AppData\\Roaming\\Microsoft\\UserSecrets\\<userSercretsId>创建它们

我在一个测试项目中让它像这样工作。 在 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来使用依赖注入,并将配置分配给 class 属性,然后像访问它一样访问它

     var secretValue = config["SomeUserSecret"];

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

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

尝试没有错误。 例如builder.AddUserSecrets();

我有同样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM