如何不从用户机密配置中获取空值?

How to not get null values from User secret configs?

我想为 KeyVault clientid 等使用用户机密。我在设置 KeyVault 时从 program.cs 调用我的配置。当我在 appsettings.json 中添加值时,一切正常,但如果我删除它并管理用户机密,当我的 program.cs 是 运行 时,它总是说 null。

而且我在创建的 secret.json 中有正确的值,并且带有 guid 的属性也在我的项目文件中

我还尝试向 secret.json 添加一个键和值,并尝试从控制器获取它,但它也是空的。

所以我的 program.se 中的 WebHost.CreateDefaultBuilder 似乎没有加载我的 secret.json 文件。

如果我在 progam.cs 中将 AssUserSecrets 添加到我的 WebHost.CreateDefaultBuilder(args) 中,则没有相同的问题。

我正在使用 WebHost.CreateDefaultBuilder 所以它应该在 asp .net core 2.2 中默认使用

dontnet user-secret list 

Will 还会显示我的 secret.json 文件中的值,所以值就在那里,用户密码已经初始化。

dontnet user-secret init

另外,假设它已经设置好了。

但在调用我的 secret.json 属性时仍然只是 null

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureServices(services => services.AddAutofac())
                .ConfigureAppConfiguration((context, builder) =>
                {
                    var config = builder.Build();
                    var vault = config["KeyVault:Vault"];
                    builder.AddAzureKeyVault($"https://{config["KeyVault:Vault"]}.vault.azure.net/", config["KeyVault:ClientId"], config["KeyVault:ClientSecret"]);

                });

我在我的网站上测试过,效果很好,这里是你可以参考的步骤。

1.Right 单击项目并 select Manage User Secrets。它将打开 Visual Studio 中的 secrets.json 文件,您可以在其中添加您的机密,并将添加到 .csproj 文件中。

2.Add 您可能希望添加到您的用户机密中的内容。它包括两种编写 json 对象和简单 key/value 对的方法。

3.Mapping 模型的用户机密。

 public class KeyVault
 {
     public string Vault { get; set; }
     public string ClientId { get; set; }
     public string ClientSecret { get; set; }
 }

4.Adding 配置。 安装包 Microsoft.VisualStudio.Web.CodeGeneration.DesignMicrosoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.UserSecrets

5.Bind 值。这是在 Startup.cs 文件中完成的。

6.Using 你映射的秘密

public class HomeController : Controller
{
    private readonly KeyVault _keyvault;
    // I’ve injected twilioAccountDetails into the constructor

    public HomeController(IOptions<KeyVault> keyvault)
    {
        // We want to know if twilioAccountDetails is null so we throw an exception if it is           
        _keyvault = keyvault.Value ?? throw new ArgumentException(nameof(keyvault));
    }
........
}

7.Call 它在 Program.cs

更多关于User Secrets in a .NET Core Web App的使用方法可以参考这个article.

似乎与:Microsoft.Extensions.Configuration.AzureKeyVault

有关

因为我一添加 nuget,它就停止工作了。

更新:更多信息。似乎最新的 Microsoft.Extensions.Configuration.AzureKeyVault 为我降级了一些配置库。然后它停止工作。

我在使用 Host.CreateDefaultBuilder() 时遇到了同样的问题,发现这是因为我的主机环境不是 Development

为了解决这个问题,我在 launchSettings.json 中添加了以下部分:

"environmentVariables": {
    "DOTNET_ENVIRONMENT": "Development"
}

参见related documentation

The following defaults are applied to the returned HostBuilder:

  • load app IConfiguration from User Secrets when EnvironmentName is 'Development' using the entry assembly

就我而言,我缺少以下 NuGet 包:

Microsoft.Extensions.Configuration.UserSecrets

安装后,它运行良好。