【问题标题】:How to not get null values from User secret configs?如何不从用户机密配置中获取空值?
【发布时间】:2023-03-08 06:22:01
【问题描述】:

我想将用户机密用于 KeyVault 客户端 ID 等。我在设置 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 

还将从我的secret.json 文件中为我显示值,因此该值存在,用户密码已被初始化。

dontnet user-secret init

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

但调用我的secret.json 属性时仍然为空

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"]);

                });

【问题讨论】:

    标签: azure asp.net-core azure-keyvault


    【解决方案1】:

    我在我的网站上进行了测试,效果很好,以下是您可以参考的步骤。

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

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

    3.将用户机密映射到模型。

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

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

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

    6.使用映射的秘密

    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.打电话给Program.cs

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

    【讨论】:

      【解决方案2】:

      似乎与:Microsoft.Extensions.Configuration.AzureKeyVault

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

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

      【讨论】:

      • 我没有删除它...我看到它不见了所以再次按下它。但这不是我问题的直接答案,所以也许其他人删除了它?这似乎是新版本的 .net 核心库和 Microsoft.Extensions.Configuration.AzureKeyVault 之间的冲突,所以我现在使用的是 Microsoft.Extensions.Configuration.AzureKeyVault 使用的相同版本。
      【解决方案3】:

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

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

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

      related documentation:

      以下默认值应用于返回的 HostBuilder:

      • 在 EnvironmentName 为“开发”时从用户密钥加载应用 IConfiguration 使用入口程序集

      【讨论】:

        【解决方案4】:

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

        Microsoft.Extensions.Configuration.UserSecrets
        

        一旦我安装了它,它就可以完美运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多