前言
在開發中經常會用到一些敏感數據,比如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/<userSecretsId>/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 dotnet run
或
export ASPNETCORE_ENVIRONMENT=Development
dotnet run
ASP.NET Core類似,這里就不再演示了。
有關.NET Core中User Secrets存儲敏感數據的內容,本文就講這些,如果您覺得對你有所幫助,請“點贊”支持一下,或者關注公眾號“chengxulvtu",謝謝!