大家好,今天给各位分享博客园网站源码分享的一些知识,其中也会对博客源码开源进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
前言
在应用程序开发的过程中,有的时候需要在代码中保存一些机密的信息,比如微信appkey,连接字符串,加密密钥,字符串,或者是用户名密码等。通常的做法是保存到一个配置文件中,例如appsettings.json,以之前文章&34;为例,其中有一段代码
@injectIConfigurationconfig\n\n[Parameter]\npublicstring?Key{get;set;}\n\nkey=Key??config[&34;];\n
意思是在IConfiguration服务获取&34;,默认在appsettings.json文件配置.问题就来了,如果我们在工程的appsettings.json文件明文保存GoogleKey,多人开发或者开源同步到Github/码云上,那肯定是极其不安全的.
严重建议勿在源代码中存储密码或其他敏感数据。也不要将生产机密用于开发或测试。机密不随应用一起部署。
用户机密介绍
使用用户机密的场景:
需要保存一些和第三方网站对接的密钥,比如和微信,微博站点使用的appkey给每个开发人员配置不用的用户名密码来访问一些资源开发人员在开发过程中使用各自本机的数据库,如何配置数据库地址、账号和密码假设说最后一项,每个开发要使用自己本机的数据库,你可能会说让每个人修改自己的appsettings.config,在提交代码的时候不提交就行了。那么如果在appsettings.config添加其他配置项的时候,显然不提交appsettings.config文件不合理的。
现在,ASP.NETCore提供了一种很优雅简洁的方式UserSecrets用来帮助我们解决这个事情。
机密管理器
机密管理器工具存储ASP.NETCore项目开发期间的敏感数据。在此上下文中,一段敏感数据是应用机密。应用机密存储在与项目树不同的位置。应用机密与特定项目关联,或者跨多个项目共享。应用机密不会签入到源代码管理中。
机密管理器工具的工作原理
机密管理器工具会隐藏实现详细信息,例如值的存储位置和存储方法。可在不知道这些实现详细信息的情况下使用该工具。这些值存储在本地计算机的用户配置文件文件夹中的JSON文件中:
Windows文件系统路径:
%APPDATA%\\Microsoft\\UserSecrets\\<user_secrets_id>\\secrets.json
Linux/macOS文件系统路径:
~/.microsoft/usersecrets/<user_secrets_id>/secrets.json
在上述文件路径中,将<user_secrets_id>替换为在项目文件中指定的UserSecretsId值。
不要编写依赖于使用机密管理器工具保存的数据的位置或格式的代码。这些实现详细信息可能有变。例如,机密值不会加密,但将来可能会加密。
启用机密存储
在VisualStudio2022中,在解决方案资源管理器中右键单击该项目,然后从上下文菜单中选择“管理用户机密”。
该操作会将UserSecretsId元素添加到项目文件的PropertyGroup中。默认情况下,UserSecretsId的内部文本是GUID。内部文本是任意的,但对于项目来说是唯一的。
<PropertyGroup>\n<UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>\n</PropertyGroup>\n
在应用程序中使用用户机密
要在应用程序中访问配置的用户机密,你需要保证project.json文件中存在依赖项:
Microsoft.Extensions.Configuration.UserSecrets并且builder.AddUserSecrets()。
然后在Startup.cs文件中通过Configuration对象访问
varbuilder=WebApplication.CreateBuilder(args);\nvarmovieApiKey=builder.Configuration[&34;];\n
实际操作
1.新建工程n01UserSecrets.将项目添加到解决方案中
dotnetnewblazorserver-on01UserSecrets\ndotnetslnaddn01UserSecrets/n01UserSecrets.csproj\n
2.在解决方案资源管理器中右键单击n01UserSecrets项目,然后从上下文菜单中选择“管理用户机密”。
打开的文件内容替换为
{\n&34;:&34;\n}\n
3.Program.cs文件使用
varmovieApiKey=builder.Configuration[&34;];\nConsole.WriteLine(movieApiKey);\n
4.Razor页面使用
Keyis@apiKey\n\n@code{\n[Inject]IConfiguration?config{get;set;}\n\nstring?apiKey{get=>config![&34;];}\n}\n
5.不同项目共享机密存储文件
以控制台为例
dotnetnewconsole-on01UserSecretsConsole\ndotnetslnaddn01UserSecretsConsole/n01UserSecretsConsole.csproj\n
5.1.在解决方案资源管理器中右键单击n01UserSecretsConsole项目,然后从上下文菜单中选择“管理用户机密”。
5.2.双击项目n01UserSecrets,打开项目配置,找到UserSecretsId一行,整行复制
<UserSecretsId>979b4b67-add4-46bb-80c6-49dab268ca91</UserSecretsId>\n
5.3.在解决方案资源管理器中右键单击n01UserSecretsConsole项目,然后从上下文菜单中选择“管理用户机密”。
5.4.双击项目n01UserSecretsConsole,找到UserSecretsId一行,替换为复制的内容
<UserSecretsId>979b4b67-add4-46bb-80c6-49dab268ca91</UserSecretsId>\n
5.5.Program.cs文件测试效果
usingMicrosoft.Extensions.Configuration;\nIConfiguration?Config;\n\nConfig=newConfigurationBuilder().AddUserSecrets<Program>().Build();\nvarapiKey=Config[&34;];\nConsole.WriteLine(apiKey);\n
.NETCLI
启用机密存储
dotnetuser-secretsinit\n
设置机密
dotnetuser-secretsset&34;&34;\n
在上述示例中,冒号表示Movies是具有ServiceApiKey属性的对象文字。
列出机密
dotnetuser-secretslist\n
删除单个机密
dotnetuser-secretsremove&34;\n
删除所有机密
dotnetuser-secretsclear\n
优先级
注意:如果你的appsetting.json文件中有和secrets.json文件中相同节点(冲突)的配置项,那么就会被secrets.json中的设置项给覆盖掉,因为builder.AddUserSecrets()晚于AddJsonFile(&34;)注册,那么我们可以利用这个特性来在每个开发人员的机器上重新设置数据库连接字符串了。
总结
以上,或许可以感受到微软在ASP.NETCore中对于开发人员还是非常贴心的,很多小细节都考虑到了,因此在我们构建应用程序的过程中,可以多使用这些小功能(特性)来让我们的代码更加的优雅~
参考资料
使用ASP.NETCore安全地存储开发中的应用机密|MicrosoftDocsASP.NETCore优雅的在开发环境保存机密(UserSecrets)-Savorboard-博客园
项目源码
Github|Gitee
知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow,不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
AlexChow
今日头条|博客园|知乎|Gitee|GitHub
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
