在開發中常常會用到一些敏感數據,好比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",謝謝!