我們的項目中幾乎都會有配置文件,里面可能會存儲一些敏感信息,比如數據庫連接字符串、第三方 API 的 AppKey 和 SecretKey 等。
對於開源項目,這些敏感信息肯定不能隨着源代碼一起提交到托管平台。
對於網站應用大多都是要部署到有公開 IP 的服務器上的,存有敏感信息的文件放在 Web 目錄下也不安全。
較好的辦法是把敏感信息文件存在項目以外的地方。
在.NET Core 中,我們可以使用 Secret Manager 工具來管理敏感信息,這個工具可以將敏感信息保存在一個 secrets.json 文件中,它不在項目文件夾下,而是存放在另外的地方。對於三種操作系統,它的位置是:
Windows: %APPDATA%/Microsoft/UserSecrets/<UserSecretsId>/secrets.json
Linux : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
Mac : ~/.microsoft/usersecrets/<UserSecretsId>/secrets.json
一個.NET Core 應用對應一個唯一的 UserSecretsId,一般是一個 GUID。
這也限制了每個開發者都必須有自己的 UserSecrets 文件夾。雖然有些麻煩,但這也有個好處。就是每個開發者可以使用不同於其它開發者的敏感數據進行開發。比如有些公司的數據庫為每個開發者創建了獨立的數據庫訪問賬號。
在 VS 中可以很方便地操作 secrets.json。右擊項目,選擇[Manage User Secrets],如圖:
編輯打開的 secrets.json 文件,把敏感信息填入其中,如:
{
"ConnectionString": "server=localhost;database=testdb;uid=root;pwd=123456;"
}
保存后,.csproj 文件中會自動生成一個 UserSecretsId:
如果不用 VS,也可以在此處手動添加 UserSecretsId,然后在項目目錄下通過命令來添加或刪除配置項,例如:
dotnet user-secrets set "Foo:ApiKey" "123456"
dotnet user-secrets remove "Foo:ApiKey"
如果 secrets.json 和 appsettings.json 有相同的配置項,程序會優先讀取前者的值。
對於 secrets.json 的所有配置項,最好也在 appsettings.json 保留相應的占位,比如:
{
"ConnectionString": "<your connection string here>"
// 其它配置
}
這樣 appsettings.json 中的占位可以告訴其它開發者有這樣一個配置。
這對於開源項目十分有用。