如何在 Asp.Net Core 中 管理敏感資料?

語言: CN / TW / HK

在應用程式開發時,你肯定會有一些特別需要保護的資料,這些資料通常是非常機密的,敏感的,禁止和別人共享,這些資訊包括:資料庫連線串,你懂的,畢竟裡面有 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" "[email protected]"

訪問 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 中的資料配置,管理和保護,而且還有這個非常 :ox::nose:的 User Secrets ,可以很好的替代以前用環境變數的方式,而且可以確保原始碼中不再有任何敏感資料,畢竟 User Secrets 是儲存在專案之外的一個資料夾下,這個路徑之前也給大家看到了,是 windows 的一個 使用者資料夾。

不過這裡有一個缺點,儲存在 User Secrets 中的資料是以明文形式存在的,不用怕,後面的文章我會討論一些其他的方法來保護使用者敏感資料,比如說: Azure application settings 和   Azure key vault