第二十七节:安全存储机密程序

一. 基本概念

1. 背景

  通常我们将 AppSecret 和数据库连接字符串存储在配置文件中,web.config 或 appsettings.json,配置文件都需要提交到SVN 和git上,对于一些开发者自己用而不需要提交的数据, 并不想进行提交,这个时候可以存储到本地机密文件中。

或者一些机密文件,不想写到配置文件中,我们想保存到服务器磁盘的机密文件中,这样更加安全。

2. 机密文件相关指令

说明:要进入对应项目的根目录,打开命令行程序,进行下面的指令的输入.

(1).【dotnet user-secrets init】:初始化密钥存储,前面的命令将 UserSecretsId 元素添加到 .csproj文件的 PropertyGroup 中。 默认情况下,UserSecretsId 的内部文本是一个 GUID。内部文本是任意的,但对项目是唯一的。

右键项目→编辑项目文件→即可查看生成的对应的UserSecretsId。

 

(2).【dotnet user-secrets set "xxx" "xxx"】:设置机密文件,eg:【dotnet user-secrets set "pwd" "123456"】,设置pwd的值为123456 。

PS:到目录【%APPDATA%\microsoft\UserSecrets\】下,找到刚才对应的UserSecretsId命名的文件夹,即该项目所有的机密文件都存在在该文件夹下的Secrets.json中。

PS:设置到指定位置 【dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"】

也可以直接右键项目→管理用户机密→直接打开secrets.json这个文件。

 

 

 

 

 

(3).【dotnet user-secrets remove "xxx"】:删除单个机密文件。

(4).【dotnet user-secrets clear】:删除所有机密文件

(5).【dotnet user-secrets list】:列出所有机密文件

 

二. 项目使用

1. 谁优先使用的问题

  当配置文件和机密文件同时存在的使用,获取同一个键,获取的是机密文件中的值。

原因:当项目调用时,用户机密配置源会自动添加到 CreateDefaultBuilder 以使用预先配置的默认值初始化主机的新实例。 DevelopmentEnvironmentName 时,CreateDefaultBuilder 调用 AddUserSecrets。

但如果没有CreateDefaultBuilder,可以手动builder.AddUserSecrets<Startup>(); 或者 builder.AddUserSecrets("UserSecretsId xxxx");

2. 获取绑定类

(1).进行机密文件的添加:【dotnet user-secrets set "UserSettings:userName" "MaRu"】 和 【dotnet user-secrets set "UserSettings:userAge" 29】

(2).创建UserSettings类

1   public class UserSettings
2     {
3         public string userName { get; set; }
4         public int userAge { get; set; }
5     }

(3).利用GetSection和Get方法进行类的绑定。

1           //获取绑定类
2             {
3                 var UserSettings = _Configuration.GetSection("UserSettings").Get<UserSettings>();
4                 var userName = UserSettings.userName;
5                 var userAge = UserSettings.userAge;
6             }

3. 机密字符串的替换

(1).背景:数据库连接字符串写在appsettings.json中,但是密码不想写在里面,想写在机密文件中,那么我们该如何实现呢?

(2) 步骤:

A:将密码写到机密文件中 【dotnet user-secrets set "pwd" "123456"】

B:获取配置文件原先的字符串和机密文件中的pwd,将“PassWord=pwd”赋值到原先的字符串中,当然这里可以用字符串的拼接,但我们这里通过“SqlConnectionStringBuilder”类,来进行处理,需要安装程序集【System.Data.SqlClient】

代码详见:ConfigureService

 1        public void ConfigureServices(IServiceCollection services)
 2         {
 3             //需要安装程序集:【System.Data.SqlClient】
 4             var builder = new SqlConnectionStringBuilder(Configuration.GetConnectionString("str"));
 5             builder.Password = Configuration["pwd"]; //从机密文件中获取pwd,并给赋值给上述的数据库连接串
 6             var newStr = builder.ConnectionString;  //得到新的连接串(包含Password),下面可以传给EF进行使用了
 7 
 8 
 9             services.AddControllersWithViews();
10         }

 

需要结合这篇文章:

  https://www.cnblogs.com/yaopengfei/p/11633385.html    (EFCore链接字符串写入机密程序中)

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2020-01-01 20:12  Yaopengfei  阅读(685)  评论(1编辑  收藏  举报