譯文鏈接:https://www.infoworld.com/article/3576292/how-to-work-with-user-secrets-in-asp-net-core.html
在應用程序開發時,你肯定會有一些特別需要保護的數據,這些數據通常是非常機密的,敏感的,禁止和別人共享,這些信息包括:數據庫連接串,你懂的,畢竟裏面有 userid 和 password,還有 OAuth 驗證用到的 accesskey,apikey 或者配置 azure,aws 等雲服務的連接信息。
當項目和別人共享的時候,這些敏感信息自然也暴露給了別人,這通常是我不想看到的結果,那怎麼去預防呢?ASP.NET Core 中有一個叫做 User Secrets
特性,它允許將用戶敏感信息存儲在項目外的一個 json 文件中,那怎麼去管理這個 json 文件呢?你可以通過 命令行工具 Secrets Manager
去進行敏感信息的管理,這篇文章主要就是來聊一聊怎麼去管理這個 User Secrets
。
在項目中添加 user secrets
可以很方便的將 user secrets 添加到你的項目中,你需要做的僅僅是。
在解決方案管理器上選擇 project
右鍵點擊選擇
Manage User Secrets
。
然後 Visual Studio 2019 會自動打開一個 secrets.json
文件。
接下來在 secrets.json 中添加一些敏感數據。
{
"ConnectionString": "This is a test connection string",
"APIKey": "This is s secret key",
"AppSettings": {
"GlobalSettings": {
"GlobalAccessKey": "This is a global access key!"
}
}
}
對了, 默認的 secret.json
文件路徑如下:
C:\Users\38034\AppData\Roaming\Microsoft\UserSecrets\b87644d3-6898-47e4-8580-b3de15f22b96
把項目編譯一下,然後打開 project 的meta文件 .csproj
,你會發現新增了一個 UserSecretsId
節點,代碼如下:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>e4f51d14-ddc1-48f4-bb34-84c114e3d6d0</UserSecretsId>
</PropertyGroup>
</Project>
使用 Secret Manager tool 管理工具
這個 Secret Manager tool
是 .NET Core 中的一個命令行管理工具,主要用來管理 Configuration 和 敏感數據,在這一節中我們一起看看怎麼使用這個小工具。
生成 user secrets
在 cmd 窗口輸入如下命令:
dotnet user-secrets init
新增 user secrets 內容
要想看到當前所有的 secrets,輸入以下命令。
dotnet user-secrets list
下圖展示了我之前創建的一些 key。
接下來用 set 命令設置一條敏感數據。
dotnet user-secrets set "AuthorApiKey" "xyz1@3"
訪問 secret
爲了能夠實現用代碼去訪問,可以用 ASP.NET Core 裏的 Configuration Api,HomeController 的代碼如下:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
//Action methods go here - this is done for brevity
}
因爲需要用 Configuration Api
去訪問,這裏我準備用依賴注入的方式來實現 configuration 的注入,代碼如下:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IConfiguration _config;
public HomeController(ILogger<HomeController> logger,
IConfiguration config)
{
_logger = logger;
_config = config;
}
//Action methods go here - this is done for brevity
}
刪除 secret
要想刪除這個 key,可以使用下面的命令。
dotnet user-secrets remove "AuthorApiKey"
如果你想移除所有的key,可以使用下面的命令。
dotnet user-secrets clear
如果你想移除某一個層級中的子層key,可以使用 :
運算符,代碼如下:
dotnet user-secrets remove "AppSettings:GlobalSettings"
ASP.NET Core 重定義了對 Configuration 中的數據配置,管理和保護,而且還有這個非常 ????????的 User Secrets
,可以很好的替代以前用環境變量的方式,而且可以確保源碼中不再有任何敏感數據,畢竟 User Secrets
是存儲在項目之外的一個文件夾下,這個路徑之前也給大家看到了,是 windows 的一個 用戶文件夾。
不過這裏有一個缺點,存儲在 User Secrets
中的數據是以明文形式存在的,不用怕,後面的文章我會討論一些其他的方法來保護用戶敏感數據,比如說:Azure application settings
和 Azure key vault
。