目录
目的
我想在调查像用户机密这样的新功能时为开发人员做很多跑腿工作。
涵盖相关主题,例如覆盖appsettings.json文件,根据环境加载适当的应用程序设置(例如开发),如何添加\更新机密。
范围
本文档的范围是传达在本地而不是在团队代码存储库中保护敏感信息所需的任务(例如,指向LocalDB的连接字符串,其中显示您的密码)。
先决条件
- Visual Studio 22(社区版)
- .NET 6 SDK(可以与VS 22安装捆绑在一起)
- SQL Server 2019 Developer Edition
为什么使用用户机密——它解决了什么问题
通常,设置放置在 appsettings.json 文件中,但有些设置我们不想在此文件中共享,例如密码、用户名或完全限定的连接字符串。
因此,用户机密用于此目的,当我们只希望机密在我的环境中对我可见时。
创建控制台项目
我们将通过实现一个简单的控制台.NET 6应用程序来演示用户机密的工作原理。
控制台.NET 6项目的新布局将只显示一个Program.cs没有管道——在这里,我们将添加所需的代码:
将用户机密NuGet包添加到项目
将以下NuGet包添加到项目中:
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets"
Version="6.0.1" />
反过来,这将在项目属性文件中创建一个名为UserSecretsId
的条目:
此GUID条目用于在(Windows)环境中构建名为 secrets.json 的新创建的文件的路径。你不会在解决方案资源管理器中看到该文件,因为它保存在漫游数据中。secrets.json 文件(未包含在代码签入中)的物理路径为:
C:\Users\oneillb\AppData\Roaming\Microsoft\UserSecrets\
050d3b82-cafe-4826-93ed-e156a0ec77be\
打开用户密钥
右键单击您的项目,然后选择上下文菜单选项“管理用户机密”。
这将打开您的secrets.json文件。最初,您的机密将是空的,因为您尚未创建任何条目。
诀窍是在secrets.json和appsettings.json文件中保持相同的json结构。
Appsettings.json(开发或生产)
Secrets.json
因此,当您引用设置时,加载哪个json文件并不重要,组合键将是有效的。
在启动时注册应用设置和用户密钥
在下面的代码片段(在您的Program.cs文件中)中,您正在创建注册管道对象的Configuration
方法(例如中间件、依赖注入等)
加载设置的顺序很重要,因为引用的最后一个设置将是使用的设置(最后一个获胜——如果加载了两个 appset 文件并且它们都有一个公共连接字符串,则上次加载的,将使用该连接字符串。)
在上面的代码中,我正在根据运行时环境设置构建一个 Appset 文件——请参阅下面的设置方式(开发):
注意:如果您的Appset文件不存在——则不会引发异常!
旁注,我正在使用下面的代码片段检索Environment
变量——然后用于构建我希望导入的Appset文件名(我不必导入这个特定的Appset——我可以加载生产并用我的用户密钥覆盖它)。
如果我只想在我的代码中引用用户机密:
读取用户机密值——运行时
一旦我加载了Appset和\或用户密钥,并且因为我在文件中具有相同的json键\值结构,我可以使引用成为一个,它将加载正确的设置。有几种方法可以根据键加载值。
检索和设置返回类型(使用完全限定的json结构):
string fullyQualifiedConnectionString =
config.GetValue<string>("ConnectionStrings:MyMusicShopConnection"); // read connection
使用完全限定的json结构检索值:
var fullyQualifiedConnectionStringShortHand =
config["ConnectionStrings:MyMusicShopConnection"];
使用节限定符(GetConnectionString
): 检索值
var conString = config.GetConnectionString("MyMusicShopConnection");
检索根级别值:
var userId = config["UserID"]; // no parent & shorthand
使用的代码片段:
https://www.codeproject.com/Tips/5346154/Visual-Studio-User-Secrets