我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串、第三方 API 的 AppKey 和 SecretKey 等。

对于开源项目,这些敏感信息肯定不能随着源代码一起提交到托管平台。

对于网站应用大多都是要部署到有公开 IP 的服务器上的,存有敏感信息的文件放在 Web 目录下也不安全。

较好的办法是把敏感信息文件存在项目以外的地方。

在.NET Core 中,我们可以使用 Secret Manager 工具来管理敏感信息,这个工具可以将敏感信息保存在一个 secrets.json 文件中,它不在项目文件夹下,而是存放在另外的地方。对于三种操作系统,它的位置是:

Windows: %APPDATA%/Microsoft/UserSecrets/<UserSecretsId>/secrets.json
Linux : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
Mac : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json

一个.NET Core 应用对应一个唯一的 UserSecretsId,一般是一个 GUID。

这也限制了每个开发者都必须有自己的 UserSecrets 文件夹。虽然有些麻烦,但这也有个好处。就是每个开发者可以使用不同于其它开发者的敏感数据进行开发。比如有些公司的数据库为每个开发者创建了独立的数据库访问账号。

在 VS 中可以很方便地操作 secrets.json。右击项目,选择[Manage User Secrets],如图:

编辑打开的 secrets.json 文件,把敏感信息填入其中,如:

{
"ConnectionString": "server=localhost;database=testdb;uid=root;pwd=123456;"
}

保存后,.csproj 文件中会自动生成一个 UserSecretsId:

如果不用 VS,也可以在此处手动添加 UserSecretsId,然后在项目目录下通过命令来添加或删除配置项,例如:

dotnet user-secrets set "Foo:ApiKey" "123456"
dotnet user-secrets remove "Foo:ApiKey"

如果 secrets.json 和 appsettings.json 有相同的配置项,程序会优先读取前者的值。

对于 secrets.json 的所有配置项,最好也在 appsettings.json 保留相应的占位,比如:

{
"ConnectionString": "<your connection string here>" // 其它配置
}

这样 appsettings.json 中的占位可以告诉其它开发者有这样一个配置。

这对于开源项目十分有用。

最新文章

  1. java面向对象中的关键字
  2. 用php实现一个简单的链式操作
  3. 谁在关心toString的性能?
  4. C# Lambda表达式
  5. jQuery判断键盘按下的keyCode
  6. (转)无法打开C盘,提示&quot;本次操作由于这台计算机的限制被取消,请与你的管理员联系”
  7. java并发:线程同步机制之ThreadLocal
  8. Centos7 创建个文件 thread 怪现象
  9. 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错
  10. 初学Android: 四大组件之Activity
  11. dialog中的button动态设置为disable[转]
  12. 空值排序(oracle和sqlserver)
  13. java 方法的重载的语法规则
  14. Angularjs1.2版本与1.3版本中控制器的问题
  15. JPA 映射单向多对一的关联关系
  16. centOS7配置DNS服务器
  17. Python安装和配置
  18. PHP 函数漏洞总结
  19. ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)
  20. bootstrap2.2登录验证

热门文章

  1. webpack4.0各个击破(5)—— Module篇
  2. Scala(四) —— 集合
  3. C# WebService创建与使用
  4. WPF DesiredSize &amp; RenderSize
  5. 【Nginx】使用nginx反向代理IIS实现80端口的解放
  6. 深入浅出Java类加载过程
  7. phpstudy等php本地环境运行缓慢的问题解决方法
  8. jQuery 父iframe与子iframe 相互调用传值
  9. 微信小程序--页面的生命周期和参数传递
  10. 免费开源ERP-成功案例分析(2)