【问题标题】:Custom Environments in ASP .Net Core Secret IssueASP .Net Core Secret 问题中的自定义环境
【发布时间】:2020-05-14 15:43:13
【问题描述】:

我们公司已经偏离了微软标准环境设置。

我们有以下环境

  • 本地 - 针对 docker compose 文件进行本地开发的环境,基础设施作为容器运行
  • 开发 - 用于 3rd 方团队的集成环境,我们将 API 连接到他们正在处理的前端。相当不稳定,因为集成环境应该是
  • 暂存 - 为我们的利益相关者提供更稳定的审核环境

我们的Startup.cs 类看起来像这样

    public void ConfigureLocalServices(IServiceCollection services)
    {
        services
            .AddApplicationServices(Configuration)
            .AddLocalIntegrationEvents(Configuration)
            .AddLocalLogging(Configuration);
    }

    public void ConfigureDevelopmentServices(IServiceCollection services)
    {
        services
            .AddApplicationServices(Configuration)
            .AddDevelopmentLogging(Configuration)
            .AddDevelopmentIntegrationEvents(Configuration);
    }

如您所见,它既美观又整洁,我们根据环境配置我们的应用程序。

现在讨论我们的问题 - 由于默认 Web 构建器仅在环境为开发时添加用户机密(据我所知,如果您在本地工作,您应该使用默认环境)我们遇到运行时异常问题没有加载红隼 HTTPS 证书,因为这个秘密是 现在缺少"Kestrel:Certificates:Development:Password": "100e0e22-09ea-40e4-bef9-469289bf8786"

我已经暂时解决了这个问题

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                //Load in secrets if environment is local as well to get our HTTPS certs loaded correctly
                if (hostingContext.HostingEnvironment.EnvironmentName.Equals("Local", StringComparison.InvariantCultureIgnoreCase))
                    config.AddUserSecrets<Startup>();

            })
             .UseStartup<Startup>()
             .UseSerilog();

一些开发人员设置了特定于另一个环境的秘密,这会在运行时导致更多问题。

据我了解,秘密文件不是特定于环境的,因此我们无法添加“本地秘密”。

为我们解决此问题的最佳方法是什么?我们的方法完全不正确吗?

【问题讨论】:

    标签: c# asp.net-core .net-core


    【解决方案1】:

    用户机密仅用于本地开发。这就是为什么它们默认仅在环境设置为 Development 时才处于活动状态。

    这也是您需要使用解决方法的原因:

    .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    //Load in secrets if environment is local as well to get our HTTPS certs loaded correctly
                    if (hostingContext.HostingEnvironment.EnvironmentName.Equals("Local", StringComparison.InvariantCultureIgnoreCase))
                        config.AddUserSecrets<Startup>();
    
                })
    

    解决方法:每个环境的用户机密

    一种解决方法是拥有多个秘密文件 GUID,并根据您的环境将此重载与不同的 GUID 一起使用:

    var env = hostingContext.HostingEnvironment.EnvironmentName;
    if(env == 'Local')
      config.AddUserSecrets(new Guid("00000000-0000-0000-0000-000000000000").ToString());
    if(env == 'Development')
      config.AddUserSecrets(new Guid("11111111-1111-1111-1111-111111111111").ToString());
    

    注意:如果您这样做,当您单击 Manage User Secrets 时,Visual Studio 中的上下文菜单可能不会显示正确的文件。

    而是找到这个目录:

    C:\Users\<USER>\AppData\Roaming\Microsoft\UserSecrets
    

    在该目录中,您使用上面使用的相同 GUID 创建一个目录(如果它不存在)。 然后添加一个secrets.json 文件,如下所示:

    备选方案 1:不同的配置提供程序

    但听起来您也想在开发人员之间分享秘密。您可以使用不同的配置提供程序。

    例如此处概述的Azure Key Vault provider
    https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1

    这允许管理云中的所有秘密,而无需通过即时消息等方式发送。

    备选方案 2:自定义配置提供程序

    如果您不喜欢 azure,有些提供商可以为其他服务提供相同的服务,或者如果它们都不适合您,您可以创建一个适合您需求的自定义服务。

    这是一篇记录如何做到这一点的博客文章:
    https://codeburst.io/create-a-custom-configuration-provider-in-asp-net-core-cdd6a32b8ecb

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多