【发布时间】: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