【问题标题】:Switching ASP.NET Secrets Configuration切换 ASP.NET 机密配置
【发布时间】:2021-02-02 17:07:27
【问题描述】:

为了避免将敏感数据存储到源代码管理中,我们有可用于开发的用户机密和可用于生产的环境。

我正在尝试正确设置我的项目。在我的开发机器上,我希望能够在 Development 和 Production 配置值之间切换,并且对于集成测试,它必须能够访问 Development 配置。

目前,集成测试配置在类库测试项目中是硬编码的,并在 appsettings.Development.json 文件中重复,我避免创建 appsettings.Production.json。这并不理想。

通常,用户机密应用于开发环境变量和生产环境变量。如果我同时设置两者,则环境变量中定义的生产配置将始终覆盖开发值。那是行不通的。

另一种解决方案是使用生产值创建 appsettings.Staging.json,并从源代码管理中排除该文件。

另一个问题。默认情况下,不会读取在类库上应用用户机密和环境变量。仅读取 Web 项目上定义的配置。此外,Integration Tests 项目将无法访问 Web 项目中定义的配置。

这会导致另外两个问题:

首先,如果我有 3 个不同的 Web 项目依赖于需要 API 密钥的同一个类库,则 API 密钥需要配置 3 次。

其次,集成测试不能使用任何这些配置,需要第四次重复配置。

配置项目的最佳方式是什么?看起来Host.CreateDefaultBuilder 不会提供理想的解决方案。创建自定义配置生成器可能是一种可行的方法,但在朝着这个方向前进之前,我希望能提供一些意见。

用户机密很好,但它们不提供切换它们的方法;而不使用用户机密意味着所有 API 密钥和密码都以纯文本形式存储在源代码控制中。也许解决方案是强制读取类库的 User Secrets,并根据 ASPNETCORE_ENVIRONMENT 读取 Secrets Manager for Development 和 Environment Variables for Staging 或 Production,但我不知道如何以这种方式配置它。

【问题讨论】:

  • 如何设置环境变量,让秘密对你不起作用
  • 在项目设置中设置的环境变量总是会覆盖其他设置,因此我无法从一种配置切换到另一种配置。在所有配置选项中,唯一提供此类选项的是 appsettings.Development.json / appsettings.Staging.json 文件。

标签: asp.net .net asp.net-mvc asp.net-core asp.net-web-api


【解决方案1】:

没有回复。好的,这就是我最终要做的。

对于集成测试,我仔细阅读了这篇文章:Integration tests in ASP.NET Core

使用Microsoft.AspNetCore.Mvc.Testing 包允许构建依赖注入容器,从而像实时运行一样测试服务配置链。

这避免了为集成测试重复配置。一件事解决了。

对于 Secrets Manager,它们非常适合与他人共享的 GitHub 类库,但对于需要切换环境的私有项目来说不是那么好。

对于私有代码,我不介意在源代码控制中拥有沙盒帐户。但是,我不希望有实时信用卡处理凭证。即使我自己编写代码,在某些时候我也会与其他程序员共享代码,我不希望他们访问这些数据。

我将沙盒帐户放在appsettings.Development.json 中,将真实帐户放在appsettings.Staging.json 中。然后,确保暂存配置不进入源代码管理并将appsettings.Staging.json 添加到.gitignore。从项目属性更改环境变量允许我切换环境。这似乎是我能做的最好的了。

只需要小心appsettings.Staging.json 保密。

【讨论】:

  • 我突然想到还有另一种选择。将设置存储在“ApiKeys”和“ApiKeysDev”中,然后根据我们是否在开发中运行有条件地读取任一部分。然后,您可以将 ApiKeys 和 ApiKeysDev 转储到 Secrets Manager 中或使用您希望的任何存储空间。
【解决方案2】:

这里有一个更好的答案。您可以创建 2 个部分:ApiKeys 和 ApiKeysDev,这意味着配置不会相互覆盖。你只需要一个开关来读取一个或另一个。

然后,您可以将所有密钥存储到 Secrets Manager 中,但这仅在 Environment 设置为 Development 时有效。这意味着您不能使用Env.IsDevelopment() 作为开关。

我结束了创建新环境变量:OntraportDev 和 BluePayDev。当设置为“1”或“true”时,我阅读 OntraportDev 部分而不是 Ontraport。这让我可以在 Live 和 Sandbox 帐户之间切换个别服务!

if (Environment.GetEnvironmentVariable("BluePayDev") == "1" || Environment.GetEnvironmentVariable("BluePayDev") == "true")
{
    services.AddOptions<BluePayConfig>()
        .Bind(configuration.GetSection("BluePayDev"))
        .ValidateDataAnnotations();
}
else
{
    services.AddOptions<BluePayConfig>()
        .Bind(configuration.GetSection("BluePay"))
        .ValidateDataAnnotations();
}

另一种选择是使用环境变量 BluePayEnv,当您将其设置为“Dev”时,它会将“Dev”附加到配置部分。这将允许您配置多个环境,并且将是一个更灵活的解决方案。这种方法的一个问题是 Visual Studio 不能将“”识别为有效的环境变量值......所以你不能在不删除变量的情况下配置无后缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多