切换ASP.NET机密配置

问题描述

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

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

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

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

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

一个问题。认情况下,不会读取在类库上应用用户密码和环境变量。仅读取Web项目上定义的配置。另外,“集成测试”项目将无法访问Web项目上定义的配置。

这导致另外两个问题:

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

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

配置项目的最佳方法是什么? Host.CreateDefaultBuilder似乎无法提供理想的解决方案。创建自定义配置构建器可能是解决问题的方法,但是在朝这个方向发展之前,我将不胜感激。

用户机密很好,但是它们不提供切换密码的方法;而未使用“用户机密”意味着所有API密钥和密码均以纯文本格式存储在源代码管理中。也许解决方案将是强制读取类库的用户密钥,并根据ASPNETCORE_ENVIRONMENT读取用于阶段或生产的开发和环境变量的Secrets Manager,但我不知道如何以这种方式进行配置。>

解决方法

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

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

使用Microsoft.AspNetCore.Mvc.Testing包可以构建Dependency Injection容器,从而像实时运行一样测试服务配置链。

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

对于Secrets Manager而言,它们非常适合与他人共享的GitHub类库,但不适用于需要切换环境的私有项目。

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

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

只需要注意,appsettings.Staging.json会被保密。

,

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

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

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

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无法将“”识别为有效的环境变量值...因此,如果不删除该变量,就无法配置后缀。