在开发中常常会用到一些敏感数据,好比AppSecret或数据库链接字符串,不管是硬编码仍是写在配置文件中,最终都要push到svn或git上。对于开源项目,这些敏感数据就无隐私可言了,对于私有项目,一旦源代码管理服务器被黑,这些敏感数据也将暴露无遗。因此,最佳实践就是不要将敏感数据写到源代码中。linux
以往咱们经常将数据库链接字符串写在web.config中,.NET Core中写在appsettings.json中,开发环境下若是一个开发者修改了链接字符串,为了避免影响其余开发者,每次提交代码的时候就应该忽略该配置文件,若是还添加了其余配置,必须提交的话,要么先撤销链接字符串的修改再提交,要么直接提交会影响其余开发人员。不少时候,咱们就是直接提交了,大不了其余开发者pull下来代码再修改一下。可是,最佳实践就是不要写在配置文件中。git
注意,上面提到的问题都是在开发环境下。web
.NET Core中为咱们提供了叫Secret Manager的工具,能够实现上文中的最佳实践,再次强调一次,Secret Manager只适用于开发环境中。数据库
下面说一下Secret Manager,它帮咱们抽象了一些细节,好比数据存储在哪以及如何存储的问题。简单来讲它帮助咱们将数据以明文的形式存在了本地的一个json文件中。系统不一样存储的位置也不同。json
Windowsbash
%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json
Linux服务器
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
Macapp
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
userSecretsId是在.csproj文件中指定的,会在下文讲到。svn
配置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/<userSecretsId>/secrets.json这个文件,userSecretsId指定了是哪一个项目的secrets。
userSecretsId在.csproj文件中指定。
<PropertyGroup> <UserSecretsId>userSecretsId的值</UserSecretsId> </PropertyGroup>
在mac或linux上,userSecretsId的值能够经过uuidgen生成。
在Microsoft.Extensions.Configuration.UserSecrets包扩展了ConfigurationBuilder,包含一个AddUserSecrets的扩展方法。若是想经过Configuration访问User Secrets只须要在调用build.AddUserSecrets()便可。
if (env.IsDevelopment()) { // 搜索包含类型Startup的程序集添加User Secrets的配置源,Startup也能够换成其余程序集中的其余类型 builder.AddUserSecrets<Startup>(); }
或干脆直接指定userSecretsId
if(env.IsDevelopment()) { builder.AddUserSecrets("UserSecretsId"); }
而后就能够经过Configuration["NameOfSecret"]访问到User Secret了。
下面经过一个控制台程序演示。
<PropertyGroup> <UserSecretsId>3BF2D901-89B9-437D-8856-CCA63D4606F7</UserSecretsId> </PropertyGroup>
以及SecretManager工具包
<ItemGroup> <DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" /> </ItemGroup>
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<Program>(); } Configuration = builder.Build(); Console.WriteLine(Configuration["AppKey"]); } }
ASP.NET Core相似,这里就再也不演示了。
有关.NET Core中User Secrets存储敏感数据的内容,本文就讲这些,若是您以为对你有所帮助,请“点赞”支持一下,或者关注公众号“chengxulvtu",谢谢!