一. 基本概念
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%microsoftUserSecrets】下,找到刚才对应的UserSecretsId命名的文件夹,即该项目所有的机密文件都存在在该文件夹下的Secrets.json中。
PS:设置到指定位置 【dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:appsWebApp1srcWebApp1"】
也可以直接右键项目→管理用户机密→直接打开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 }