十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在开发中经常会用到一些敏感数据比如AppSecret或数据库连接字符串无论是硬编码还是写在配置文件中最终都要push到svn或git上。对于开源项目这些敏感数据就无隐私可言了对于私有项目一旦源代码管理服务器被黑这些敏感数据也将暴露无遗。所以最佳实践就是不要将敏感数据写到源代码中。
创新互联建站致力于成都网站设计、成都网站建设,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联建站,就选择了安全、稳定、美观的网站建设服务!
以往我们常常将数据库连接字符串写在web.config中.NET Core中写在appsettings.json中开发环境下如果一个开发者修改了连接字符串为了不影响其他开发者每次提交代码的时候就应该忽略该配置文件如果还添加了其他配置必须提交的话要么先撤销连接字符串的修改再提交要么直接提交会影响其他开发人员。很多时候我们就是直接提交了大不了其他开发者pull下来代码再修改一下。但是最佳实践就是不要写在配置文件中。
注意上面提到的问题都是在开发环境下。
.NET Core中为我们提供了叫Secret Manager的工具可以实现上文中的最佳实践再次强调一次Secret Manager只适用于开发环境中。
下面说一下Secret Manager它帮我们抽象了一些细节比如数据存储在哪以及如何存储的问题。简单来说它帮助我们将数据以明文的形式存在了本地的一个json文件中。系统不同存储的位置也不一样。
Windows
%APPDATA%\microsoft\UserSecrets\\secrets.json
Linux
~/.microsoft/usersecrets//secrets.json
Mac
~/.microsoft/usersecrets//secrets.json
userSecretsId是在.csproj文件中指定的会在下文讲到。
配置User Secrets及访问需要用到两个包分别为
Microsoft.Extensions.SecretManager.Tools
Microsoft.Extensions.Configuration.UserSecrets
简单说一下两者的作用第一个是工具包可以使用dotnet user-secrets命令将数据存储到json文件中第二个包可以通过.NET Core的配置系统访问存储在json文件中的数据。
dotnet user-secrets -h
这个命令可以查看Secret Manager的用法。
它有4个命令
命令 | 描述 | 语法 |
---|---|---|
clear | 删除程序中所有的secrets | dotnet user-secrets clear |
list | 列举程序中所有的secrets | dotnet user-secrets list |
remove | 删除指定的secret | dotnet user-secrets remove NameOfSecret |
set | 设置secret | dotnet user-secrets set NameOfSecret ValueOfSecret |
以Mac上举例上面的命令都是操作~/.microsoft/usersecrets/\/secrets.json这个文件userSecretsId指定了是哪个项目的secrets。
userSecretsId在.csproj文件中指定。
userSecretsId的值
在mac或linux上userSecretsId的值可以通过uuidgen生成。
在Microsoft.Extensions.Configuration.UserSecrets包扩展了ConfigurationBuilder包含一个AddUserSecrets的扩展方法。如果想通过Configuration访问User Secrets只需要在调用build.AddUserSecrets()即可。
if (env.IsDevelopment()) { // 搜索包含类型Startup的程序集添加User Secrets的配置源Startup也可以换成其他程序集中的其他类型 builder.AddUserSecrets(); }
或干脆直接指定userSecretsId
if(env.IsDevelopment()) { builder.AddUserSecrets("UserSecretsId"); }
然后就可以通过Configuration["NameOfSecret"]访问到User Secret了。
下面通过一个控制台程序演示。
mkdir user-secrets && cd user-secrets # 新建一个目录
dotnet new console # 创建一个控制台应用
dotnet restore # 还原包
dotnet add package Microsoft.Extensions.Configuration.UserSecrets -v 1.1.2 # 安装包
code . # 使用Visual Studio Code打开
在user-secrets.csproj中添加UserSecretsId
3BF2D901-89B9-437D-8856-CCA63D4606F7
以及SecretManager工具包
dotnet user-secrets set AppKey 12345 # 添加名为AppKey的Secret
为了判断是在开发环境中需要添加环境变量因此需要再安装一个包
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2
打开Program.cs加入以下代码
class Program { public static IConfigurationRoot Configuration { get; set; } static void Main(string[] args) { var builder = new ConfigurationBuilder() .AddEnvironmentVariables(); var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); if (environment == "Development") { builder.AddUserSecrets(); } Configuration = builder.Build(); Console.WriteLine(Configuration["AppKey"]); } }
运行
ASPNETCORE_ENVIRONMENT=Development dotnet run
或
export ASPNETCORE_ENVIRONMENT=Development
dotnet run
ASP.NET Core类似这里就不再演示了。