首页 > 解决方案 > .Net Core 是否支持每个环境的用户机密?

问题描述

假设我有指定的开发环境的appsettings.Development.json连接字符串和指定的暂存环境的连接字符串appsettings.Staging.json

在 Development 和 Staging 之间切换所需要做的就是导航到项目属性中的 Visual Studio Debug 选项卡并更改ASPNETCORE_ENVIRONMENT环境变量的值。

appsettings.*.json现在,出于安全原因,我当然不想输入连接字符串。所以我把它移到用户机密。

问题是 - 似乎secrets.json所有环境都使用一个文件。没有secrets.Development.jsonsecrets.Staging.json。这意味着在我通过 Visual Studio 调试选项卡从开发环境切换到暂存环境后,我还需要手动更改连接字符串,secrets.json这违背了为环境提供内置支持的目的。

不支持基于每个环境的用户机密是否正确?如果是这样 - 是否有另一种方法可以避免在切换环境时手动修改秘密连接字符串?

标签: visual-studioasp.net-core.net-corevisual-studio-2019

解决方案


如果您检查工具的参数,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

推荐阅读