[小菜一碟] 如果開發用的資料庫連線字串不能放 appsettings.Development.json,那要放哪?

資安 ISSUE」,此語一出,誰與爭鋒?約莫 15 年前,跟前輩在閒聊,說客戶那邊丟了一句「資安 ISSUE」,所以這個元件不准用、那個 SDK 不准裝,結果東西做好了,案子結不了案。時間回到今天,資安那邊丟了一個訊息:

appsettings.Development.json 裡面的 Server=(localdb)\MSSQLLocalDB;Database=dev;Integrated Security=true 這個連線字串有資安疑慮,請修正。

汝母安好否?好,我改。

微軟爸爸早料到我們會有這麼一天了,已經幫我們準備好了,如何在 ASP.NET Core 的開發中安全儲存應用程式秘密,在文章中有教使用 CLI 啟用 Secret Storage 的方式,但我這邊分享純手工的方式。

建立 UserSecrets 資料夾

首先,在 %APPDATA%\Microsoft 資料夾中,如果沒有看到 UserSecrets 資料夾,請手動建立它。

產生 UserSecretsId

這個 UserSecretsId 不一定要是 GUID 的格式,自己開心就好,但通常是 GUID 格式,假設產生的 UserSecretsId 是「n83x82c5a3gvd9vkdp75qc8d5x8ku67bmhcjfwfimhn7eg5t6yxdzqum9e6q275x」,開啟專案檔,將 UserSecretsId 塞進 <PropertyGroup> 之中。

接著,用 UserSecretsId 在 %APPDATA%\Microsoft\UserSecrets 中建立一個資料夾。

建立 secrets.json

最後,在 UserSecretsId 資料夾裡面建立 secrets.json,這個 secrets.json 就是我們開發者本機的 appsettings.json,ASP.NET Core 應用程式載入時,會套用 secrets.json 裡面的設定。

現在我在 secrets.json 新增以下設定值:

{
  "ConnectionStrings": {
    "DefaultConnection": "Default DB Connection String"
  }
}

而原本專案內的 appsettings.json 及 appsettings.Development.json 都保持預設值不動,此時存取到的設定值,可以看到就是 secrets.json 裡面的設定值。

「本來無一物,何處惹塵埃。」,最沒有資安疑慮的設定值就是沒有這個設定值。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學