问题描述
为了避免将敏感数据存储到源代码管理中,我们有可用于开发的用户密钥和可用于生产的环境。
我正在尝试正确设置我的项目。在我的开发机器上,我希望能够在“开发”和“生产”配置值之间切换,对于集成测试,它必须能够访问“开发”配置。
当前,集成测试配置在类库测试项目中进行了硬编码,并在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无法将“”识别为有效的环境变量值...因此,如果不删除该变量,就无法配置后缀。