在開發(fā)中經(jīng)常會用到一些敏感數(shù)據(jù)比如AppSecret或數(shù)據(jù)庫連接字符串無論是硬編碼還是寫在配置文件中最終都要push到svn或git上。對于開源項目這些敏感數(shù)據(jù)就無隱私可言了對于私有項目一旦源代碼管理服務(wù)器被黑這些敏感數(shù)據(jù)也將暴露無遺。所以最佳實踐就是不要將敏感數(shù)據(jù)寫到源代碼中。
創(chuàng)新互聯(lián)建站致力于成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標準化,推過標準化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)建站,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
以往我們常常將數(shù)據(jù)庫連接字符串寫在web.config中.NET Core中寫在appsettings.json中開發(fā)環(huán)境下如果一個開發(fā)者修改了連接字符串為了不影響其他開發(fā)者每次提交代碼的時候就應(yīng)該忽略該配置文件如果還添加了其他配置必須提交的話要么先撤銷連接字符串的修改再提交要么直接提交會影響其他開發(fā)人員。很多時候我們就是直接提交了大不了其他開發(fā)者pull下來代碼再修改一下。但是最佳實踐就是不要寫在配置文件中。
注意上面提到的問題都是在開發(fā)環(huán)境下。
.NET Core中為我們提供了叫Secret Manager的工具可以實現(xiàn)上文中的最佳實踐再次強調(diào)一次Secret Manager只適用于開發(fā)環(huán)境中。
下面說一下Secret Manager它幫我們抽象了一些細節(jié)比如數(shù)據(jù)存儲在哪以及如何存儲的問題。簡單來說它幫助我們將數(shù)據(jù)以明文的形式存在了本地的一個json文件中。系統(tǒng)不同存儲的位置也不一樣。
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命令將數(shù)據(jù)存儲到j(luò)son文件中第二個包可以通過.NET Core的配置系統(tǒng)訪問存儲在json文件中的數(shù)據(jù)。
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 | 設(shè)置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只需要在調(diào)用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 # 創(chuàng)建一個控制臺應(yīng)用
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
為了判斷是在開發(fā)環(huán)境中需要添加環(huán)境變量因此需要再安裝一個包
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類似這里就不再演示了。