標籤:資料庫連接 原始碼 設定檔 伺服器 開發人員net
在開發中經常會用到一些敏感性資料比如AppSecret或資料庫連接字串無論是寫入程式碼還是寫在設定檔中最終都要push到svn或git上。對於開源項目這些敏感性資料就無隱私可言了對於私人項目一旦原始程式碼控制伺服器被黑這些敏感性資料也將暴露無遺。所以最佳實務就是不要將敏感性資料寫到原始碼中。
以往我們常常將資料庫連接字串寫在web.config中.NET Core中寫在appsettings.json中開發環境下如果一個開發人員修改了連接字串為了不影響其他開發人員每次提交代碼的時候就應該忽略該設定檔如果還添加了其他配置必須提交的話要麼先撤銷連接字串的修改再提交要麼直接提交會影響其他開發人員。很多時候我們就是直接提交了大不了其他開發人員pull下來代碼再修改一下。但是最佳實務就是不要寫在設定檔中。
注意上面提到的問題都是在開發環境下。
Secret Manager
.NET Core中為我們提供了叫Secret Manager的工具可以實現上文中的最佳實務再次強調一次Secret Manager只適用於開發環境中。
下面說一下Secret Manager它幫我們抽象了一些細節比如資料存放區在哪以及如何儲存的問題。簡單來說它協助我們將資料以明文的形式存在了本地的一個json檔案中。系統不同儲存的位置也不一樣。
Windows
%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json
Linux
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
Mac
~/.microsoft/usersecrets/<userSecretsId>/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檔案中指定。
<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了。
項目實踐
下面通過一個控制台程式示範。
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
<PropertyGroup><UserSecretsId>3BF2D901-89B9-437D-8856-CCA63D4606F7</UserSecretsId></PropertyGroup>
以及SecretManager工具包
<ItemGroup><DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" /></ItemGroup>
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<Program>(); } Configuration = builder.Build(); Console.WriteLine(Configuration["AppKey"]); }}
運行
ASPNETCORE_ENVIRONMENT=Development dot
net run
或
export ASPNETCORE_ENVIRONMENT=Development
dotnet run
ASP.NET Core類似這裡就不再示範了。
.NET Core程式中使用User Secrets儲存敏感性資料