无法读取 .net 核心 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(( 是真的。

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

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

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

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

似乎如果您的项目文件夹中有secrets.json,这将覆盖由在C:Users<user>AppDataRoamingMicrosoftUserSecrets<userSercretsId>中创建它们的Manage User Secrets创建的文件

我在测试项目中让它像这样工作。 在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 文件和

  • 在目标框架下添加<UserSecretsId>Insert New Guid Here</UserSecretsId>
  • 在物料组内添加<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0"/>
  • 重新加载CSPROJ文件 - 然后您可以右键单击它并选择"管理用户机密",这将为您创建secrets.json文件。

尝试不要假。 例如,建造者。AddUserSecrets((;

我有同样的问题。

最新更新