在開發期間安全地儲存應用程式密碼

提示

本內容節錄自《容器化 .NET 應用程式的 .NET 微服務架構》(.NET Microservices Architecture for Containerized .NET Applications) 電子書,可以在 .NET Docs 上取得,或免費下載可供離線閱讀的 PDF。

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

為了連接到受保護的資源和其他服務,ASP.NET Core 應用程式通常需要使用包含機密資訊的連接字串、密碼或其他認證。 這些機密資訊稱為「祕密」。 最佳做法是不要在原始程式碼中包含祕密,而且絕不要在原始檔控制中儲存祕密。 相反地,您應該使用 ASP.NET Core 組態模型,從更安全的位置讀取秘密。

您必須將用於存取開發和暫存資源的祕密,與用於存取生產資源的祕密分開,因為不同的人需要存取不同組的祕密。 若要儲存在開發期間使用的秘密,常見的方法是將秘密儲存在環境變數中,或藉由使用 ASP.NET Core Secret Manager 工具來儲存。 為了在生產環境中更安全的儲存,微服務可以將秘密儲存在 Azure Key Vault 中。

將祕密儲存在環境變數中

將秘密與原始程式碼分開保存的一個方法,是由開發人員在其開發電腦上將字串型秘密設定為環境變數。 當您使用環境變數來儲存具有階層式名稱的祕密 (例如巢狀於組態區段中) 時,您必須將變數命名以包含其區段的完整階層 (以冒號 (:) 分隔)。

例如,將環境變數 Logging:LogLevel:Default 設定為 Debug 相當於下列 JSON 檔案中的設定值:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

若要從環境變數存取這些值,應用程式只需要在建構 IConfigurationRoot 物件時,在其 ConfigurationBuilder 上呼叫 AddEnvironmentVariables

注意

環境變數通常會儲存為純文字,因此如果電腦或具有環境變數的處理序遭到入侵,就會顯示環境變數值。

使用 ASP.NET Core Secret Manager 儲存祕密

ASP.NET Core Secret Manager 工具提供另一種方法以在開發期間將秘密與原始程式碼分開保存。 若要使用 Secret Manager 工具,請在您的專案檔中安裝套件 Microsoft.Extensions.Configuration.SecretManager。 一旦該相依性存在並已還原,即可使用 dotnet user-secrets 命令從命令列設定祕密的值。 這些秘密會儲存在使用者設定檔目錄中的 JSON 檔案中 (細目會因 OS 而異),並遠離原始程式碼。

Secret Manager 工具所設定的祕密會依使用祕密之專案的 UserSecretsId 屬性來組織。 因此,請務必在專案檔中設定 UserSecretsId 屬性,如下列程式碼片段所示。 預設值是 Visual Studio 指派的 GUID,但只要它在您電腦中是唯一的,則實際字串並不重要。

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

若要使用 Secret Manager 儲存在應用程式中的祕密,請在 ConfigurationBuilder 執行個體上呼叫 AddUserSecrets<T> 以在其設定中包含應用程式的祕密。 泛型參數 T 應該是已套用 UserSecretId 之組件的類型。 通常,使用 AddUserSecrets<Startup> 沒有問題。

Program.cs 中使用 CreateDefaultBuilder 方法時,AddUserSecrets<Startup>() 會包含在開發環境的預設選項中。