天天看點

.NET Core程式中使用User Secrets存儲敏感資料

在開發中經常會用到一些敏感資料比如AppSecret或資料庫連接配接字元串無論是寫死還是寫在配置檔案中最終都要push到svn或git上。對于開源項目這些敏感資料就無隐私可言了對于私有項目一旦源代碼管理伺服器被黑這些敏感資料也将暴露無遺。是以最佳實踐就是不要将敏感資料寫到源代碼中。

以往我們常常将資料庫連接配接字元串寫在web.config中.NET Core中寫在appsettings.json中開發環境下如果一個開發者修改了連接配接字元串為了不影響其他開發者每次送出代碼的時候就應該忽略該配置檔案如果還添加了其他配置必須送出的話要麼先撤銷連接配接字元串的修改再送出要麼直接送出會影響其他開發人員。很多時候我們就是直接送出了大不了其他開發者pull下來代碼再修改一下。但是最佳實踐就是不要寫在配置檔案中。

注意上面提到的問題都是在開發環境下。

.NET Core中為我們提供了叫Secret Manager的工具可以實作上文中的最佳實踐再次強調一次Secret Manager隻适用于開發環境中。

下面說一下Secret Manager它幫我們抽象了一些細節比如資料存儲在哪以及如何存儲的問題。簡單來說它幫助我們将資料以明文的形式存在了本地的一個json檔案中。系統不同存儲的位置也不一樣。

Windows

Linux

Mac

userSecretsId是在.csproj檔案中指定的會在下文講到。

配置User Secrets及通路需要用到兩個包分别為

簡單說一下兩者的作用第一個是工具包可以使用dotnet user-secrets指令将資料存儲到json檔案中第二個包可以通過.NET Core的配置系統通路存儲在json檔案中的資料。

這個指令可以檢視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檔案中指定。

在mac或linux上userSecretsId的值可以通過uuidgen生成。

在Microsoft.Extensions.Configuration.UserSecrets包擴充了ConfigurationBuilder包含一個AddUserSecrets的擴充方法。如果想通過Configuration通路User Secrets隻需要在調用build.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

以及SecretManager工具包

dotnet user-secrets set AppKey 12345 # 添加名為AppKey的Secret

為了判斷是在開發環境中需要添加環境變量是以需要再安裝一個包

dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2

打開Program.cs加入以下代碼

運作

ASPNETCORE_ENVIRONMENT=Development dotnet run

export ASPNETCORE_ENVIRONMENT=Development

dotnet run

ASP.NET Core類似這裡就不再示範了。

本文轉自xmgdc51CTO部落格,原文連結:http://blog.51cto.com/12953214/1942913 ,如需轉載請自行聯系原作者

繼續閱讀