若要與受保護的資源和其他服務連線,ASP.NET Core 應用程式通常需要使用連接字串、密碼或其他包含敏感性資訊的認證。 這些敏感性資訊片段稱為 秘密。 最佳做法是不要在原始程式碼中包含秘密,並確保不要將秘密儲存在原始檔控制中。 相反地,您應該使用 ASP.NET Core 組態模型,從更安全的位置讀取秘密。
您必須將用於存取開發和預備資源的秘密與用來存取生產資源的秘密區隔開,因為不同的個人需要存取這些不同密碼集。 若要儲存開發期間所使用的秘密,常見的方法是將秘密儲存在環境變數中,或使用 ASP.NET Core Secret Manager 工具。 為了在生產環境中提供更安全的儲存,微服務可以將機密儲存在 Azure Key Vault 中。
將秘密儲存在環境變數中
讓秘密遠離原始程式碼的其中一個方法是讓開發人員將字串型秘密設定為 環境變數, 其開發電腦上。 當您使用環境變數來儲存具有階層式名稱的秘密時,例如組態區段中巢狀的秘密,您必須將變數命名為包含其區段的完整階層,並以冒號分隔(:)。
例如,將環境變數 Logging:LogLevel:Default 設定為 Debug 值相當於下列 JSON 檔案中的組態值:
{
"Logging": {
"LogLevel": {
"Default": "Debug"
}
}
}
若要從環境變數存取這些值,應用程式只需要在建構 AddEnvironmentVariables 物件時,在其 ConfigurationBuilder 上呼叫 IConfigurationRoot。
注意
環境變數通常會儲存為純文本,因此,如果計算機或具有環境變數的進程遭到入侵,則會顯示環境變數值。
使用 ASP.NET 核心秘密管理員儲存秘密
ASP.NET Core Secret Manager 工具提供另一種方法,讓您在開發 期間,將秘密避免包含在原始程式碼中。 若要使用 Secret Manager 工具,請在專案檔中安裝套件 Microsoft.Extensions.Configuration.UserSecrets。 一旦該相依性存在且已還原,dotnet user-secrets 命令就可以用來設定命令行中的秘密值。 這些秘密會儲存在使用者配置檔目錄中的 JSON 檔案中(詳細數據會因 OS 而異),遠離原始程式碼。
秘密管理員工具所設定的秘密是由使用秘密之專案的 UserSecretsId 屬性所組織。 因此,您必須確定在項目檔中設定 UserSecretsId 屬性,如下列代碼段所示。 預設值是由 Visual Studio 指派的 GUID,但實際字串只要在你的電腦中是唯一的,就不重要。
<PropertyGroup>
<UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>
應用程式使用秘密管理員中儲存的秘密,可以呼叫 AddUserSecrets<T> 實例上的 ConfigurationBuilder,將秘密納入應用程式的組態中。 泛型參數 T 應該是套用了 UserSecretId 的程序集中的一種型別。 通常,使用 AddUserSecrets<Startup> 沒問題。
在 AddUserSecrets<Startup>()中使用 CreateDefaultBuilder 方法時,開發環境的預設選項會包含 。