ASP.NET Core 使用 Secret Manager 儲存機密設定值

在 ASP.NET Core 中預設是使用 appsettings.json 設定檔儲存設定值,也可以使用 appsettings.{Environment}.json 這樣的方式來儲存特定環境的設定檔,例如開發環境: appsettings.Development.json 。

在 ASP.NET Core 中還有提供另一種方式來儲存機密資訊,就是本篇要介紹的 Secret Manager (User Secrets) ,適合用在開發階段中儲存機密資訊,不會將這些資料寫在上面提到的 appsettings.json 設定檔內,避免不小心將資料儲存至 git 等版本控制中,並且使用方式和 appsettings.json 設定檔一模一樣,但是優先度更高,兩個地方都有同樣的內容時會以 Secret Manager 的為主,不過此方式還是使用明文儲存,不適合在正式環境中使用。

啟用 Secret Manager 儲存設定值

到專案目錄下(有 .csproj 檔案的那一層)執行下列程式碼:
    
dotnet user-secrets init
    

就會自動產生 UserSecretsId 並寫到專案的 .csproj 檔案中
    
<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
      <UserSecretsId>3b79d513-e6f7-4eab-85f3-bfe358ae7434</UserSecretsId>
  </PropertyGroup>

</Project>
    

增加/修改設定值

假設在 appsettings.json 中有以下設定值:
    
{
  "Key1": "Value1",
  "Key2": {
    "SubKey1": "Value2",
    "SubKey2": 100
  }
}
    

有許多種讀取方式,這裡示範最簡單的在 Program.cs 中讀取設定值的方式:
    
var app = builder.Build();

var key1 = builder.Configuration["Key1"];
var subKey1 = builder.Configuration["Key2:SubKey1"]; 
var subKey2 = builder.Configuration["Key2:SubKey2"];

Console.WriteLine($"Key1: {key1}");
Console.WriteLine($"SubKey1: {subKey1}");
Console.WriteLine($"SubKey2: {subKey2}");


// Key1: Value1
// SubKey1: Value2
// SubKey2: 100
    

我們可以使用下列指令來設定/更新設定值內容:
    
dotnet user-secrets set "Key" "Value"
    

以上面的範例可以這樣設定:
    
dotnet user-secrets set "Key1" "S1"
dotnet user-secrets set "Key2:SubKey1" "S2-1"
dotnet user-secrets set "Key2:SubKey2" "S2-2"
    

再次執行專案就會發現已經從 User Secrets 中讀取設定值了,執行結果為:
    
Key1: S1
SubKey1: S2-1
SubKey2: S2-2
    

Secret Manager 常用指令

查看所有設定值:
    
dotnet user-secrets list
    

移除指定設定值:
    
dotnet user-secrets remove [key]
    

移除全部設定值:
    
dotnet user-secrets remove clear
    

Secret Manager 設定值儲存位置

依照不同的作業系統這些設定值會儲存在下列位置:
Windows
    
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
    

Linux/macOS
    
~/.microsoft/usersecrets/<user_secrets_id>/secrets.json
    

在 dotnet user-secrets init 後檔案並不會直接建立,要等到使用 dotnet user-secrets set 後才會實際建立檔案。

參考資料:
Microsoft.Learn - Safe storage of app secrets in development in ASP.NET Core

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com