開發的過程中經常會有機密資訊需要設定,例如資料庫的連線字串、服務平台的 API 金鑰,如何保護這些機密不被外流,是件很值得探討的議題,而在 .NET 的開發環境中,有提供 Secret Manager 的套件讓我們輕鬆的保護應用程式的機密資訊。
請不要將資料庫連線字串等機密資訊放在版控中的,尤其是帳號密碼。
Visual Studio
在 Viusal Studio 中使用 Secret Manager 動作滿簡單的,只要在方案總管中的專案上按滑鼠右鍵,選擇管理使用者密碼
執行後 Visual Studio 會在你本機產生 secrets.json
檔,路徑會根據作業系統不同:
- Windows:
%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json
- Linux:
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
- Mac:
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
官方文件表示,不應該依賴這個路徑及相關實作的細節,因為這路徑或實作細節可能會依版本而修改。
有注意到上述路徑有一段 <userSecretsId>
嗎?這段會是系統產生的 GUID 值,Secret Manager 會使用這組 userSecretsId
來將你的專案及 secret.json
綁在一起。
觀察你的專案檔 .csproj
,裡面的 PropertyGroup
中會新增一段 UserSecretsId
節點,這裡面的值就是對應到上述路徑的userSecretsId
。
接者開啟 secrets.json
檔案,這個檔案的設定會覆蓋 appsettings.json
的內容,例如這兩個檔案都有 SecretSetting
這個設定,在開發過程中,Visual Studio 會使用你本機 secrets.json
中的 SecretSetting
來做設定。
如此一來,就可以達到應用程式的機密資訊只存在有權限的人身上,Secret save with you.
.NET CLI
使用 .NET CLI 命令列工具也可以達成一樣的任務。
首先需要將 Microsoft.Extensions.SecretManager.Tools
.NET CLI 套件加入 .csproj
檔案中,程式碼如下;
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
</ItemGroup>
設定後執行 dotnet resotre
還原相依套件,接著就可以使用 dotnet user-secrets 指令來呼叫 Secret Manager。
可利用 dotnet user-secrets -h
查詢該指令的使用方式,基本執行令對照如下:
指令 | 說明 | 語法 |
---|---|---|
list | 查詢程式中所有 Secrets | dotnet user-secrets list |
set | 設定指定的 Secret | dotnet user-secrets set [SECRET_SETTING] [VALUE} |
remove | 刪除指定的 Secret | dotnet user-secrets remove [SECRET_SETTING] |
clear | 刪除程式中所有 Secrets | dotnet user-secrets clear |
這裡使用 Dotnet Core 2.0 的環境,建立 ASP.NET Core WebAPI 專案做測試範例。
完整範例程式碼請參考 poychang/DemoDotnetCoreSecretManager。
參考資料: