visual-studio - .Net Core 是否支持每个环境的用户机密?
问题描述
假设我有指定的开发环境的appsettings.Development.json
连接字符串和指定的暂存环境的连接字符串appsettings.Staging.json
在 Development 和 Staging 之间切换所需要做的就是导航到项目属性中的 Visual Studio Debug 选项卡并更改ASPNETCORE_ENVIRONMENT
环境变量的值。
appsettings.*.json
现在,出于安全原因,我当然不想输入连接字符串。所以我把它移到用户机密。
问题是 - 似乎secrets.json
所有环境都使用一个文件。没有secrets.Development.json
或secrets.Staging.json
。这意味着在我通过 Visual Studio 调试选项卡从开发环境切换到暂存环境后,我还需要手动更改连接字符串,secrets.json
这违背了为环境提供内置支持的目的。
不支持基于每个环境的用户机密是否正确?如果是这样 - 是否有另一种方法可以避免在切换环境时手动修改秘密连接字符串?
解决方案
如果您检查工具的参数,dotnet user-secrets --help
您会发现您可以为每个配置(调试、发布、任何其他您想要的)指定不同的秘密,但不能为每个环境指定不同的秘密。如果你仔细想想,这不是一个糟糕的决定。
ASPNETCORE_ENVIRONMENT
环境变量旨在告诉您的应用程序当前机器或容器是开发、生产还是其他环境,因此它可以选择适当的设置文件。预计此环境变量不会从一个应用程序执行更改为下一个应用程序执行。即使在使用容器时,环境变量也会从主机传递到容器,并且不会在容器的生命周期内发生变化。
出于开发目的,这些secrets
文件应该是每台机器的,因此无需为每个环境保留单独的文件。使用单独的文件进行配置更有意义,允许开发人员简单地从 Dev 更改为 Release 或 Testing 或他们可能拥有的任何其他自定义配置。
为每个配置指定秘密
该dotnet user-secrets
工具的工作原理是从项目文件中读取UserSecretsId
值并将机密存储在具有相同名称的 JSON 文件中,例如c952ecfc-344e-43e1-bb67-1ac05973d6c6.json
. 可以为每个配置存储一个UserSecretsId
。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<UserSecretsId>c952ecfc-344e-43e1-bb67-1ac05973d6c6</UserSecretsId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<UserSecretsId>7D104000-2230-4EDE-8AE6-63BDDA0BD0C5</UserSecretsId>
</PropertyGroup>
当-c
参数用于指定配置时,该user-secrets
工具将从UserSecretsId
相应部分读取值并使用它来存储或读取秘密。
该dotnet user-secrets init
命令无法识别-c
参数,因此csproj
需要直接修改文件。
完成后,可以通过指定配置来设置和读取机密,例如:
❯ dotnet user-secrets set -c Debug Key1 Value1
Successfully saved Key1 = Value1 to the secret store.
❯ dotnet user-secrets set -c Release Key1 Value2
Successfully saved Key1 = Value2 to the secret store.
❯ dotnet user-secrets list -c Debug
Key1 = Value1
❯ dotnet user-secrets list -c Release
Key1 = Value2
推荐阅读
- spring - Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core
- c++ - Message::simbolo 使用未定义的类符号
- css - 在相对 div 中居中图像
- android - 我可以写入 Android 设备上的内部存储以检查设备上是否已安装应用程序吗?
- three.js - 如何在轴上旋转 3D 对象
- c# - 在 ViewComponent 中:此异步方法缺少“等待”运算符,将同步运行
- r - 根据R中的扩展名和目录获取文件
- javascript - 使用 forEach 函数添加选项元素以选择 HTML 元素
- image - 如何使用 Vue 方法作为图像源?
- python - 如何避免在 Papermill 中名为“kernelspec”的 Keyerror?