Stocker des secrets d’application en toute sécurité pendant le développementStore application secrets safely during development

Pour se connecter à des ressources protégées et à d’autres services, les applications ASP.NET Core doivent généralement utiliser des chaînes de connexion, des mots de passe ou d’autres informations d’identification qui contiennent des informations sensibles.To connect with protected resources and other services, ASP.NET Core applications typically need to use connection strings, passwords, or other credentials that contain sensitive information. Ces informations sensibles sont appelées secrets.These sensitive pieces of information are called secrets. La bonne pratique consiste à ne pas inclure les secrets dans le code source, et à veiller à ne pas les stocker dans le contrôle de code source.It's a best practice to not include secrets in source code and making sure not to store secrets in source control. Au lieu de cela, vous devez utiliser le modèle de configuration ASP.NET Core pour lire les secrets à partir d’emplacements plus sécurisés.Instead, you should use the ASP.NET Core configuration model to read the secrets from more secure locations.

Vous devez distinguer les secrets destinés à accéder aux ressources de développement et de préproduction de ceux utilisés pour accéder aux ressources de production, car ce ne sont pas les mêmes personnes qui ont besoin d’accéder à ces différents jeux de secrets.You must separate the secrets for accessing development and staging resources from the ones used for accessing production resources, because different individuals will need access to those different sets of secrets. Dans la pratique, les secrets utilisés en phase de développement sont généralement stockés dans des variables d’environnement ou avec l’outil Secret Manager d’ASP.NET Core.To store secrets used during development, common approaches are to either store secrets in environment variables or by using the ASP.NET Core Secret Manager tool. Pour un stockage plus sécurisé dans les environnements de production, les microservices peuvent stocker les secrets dans Azure Key Vault.For more secure storage in production environments, microservices can store secrets in an Azure Key Vault.

Stocker des secrets dans des variables d’environnementStore secrets in environment variables

Pour les développeurs, l’un des moyens de maintenir les secrets en dehors du code source est de définir des secrets basés sur des chaînes prenant la forme de variables d’environnement sur leurs machines de développement.One way to keep secrets out of source code is for developers to set string-based secrets as environment variables on their development machines. Quand vous utilisez des variables d’environnement pour stocker des secrets avec des noms hiérarchisés (tels que ceux imbriqués dans des sections de configuration), vous devez nommer les variables de façon à inclure la hiérarchie complète de leurs sections, en les séparant de deux-points (:).When you use environment variables to store secrets with hierarchical names, such as the ones nested in configuration sections, you must name the variables to include the complete hierarchy of its sections, delimited with colons (:).

Par exemple, le fait d’affecter la valeur Debug à une variable d’environnement Logging:LogLevel:Default équivaudrait à une valeur de configuration du fichier JSON suivant :For example, setting an environment variable Logging:LogLevel:Default to Debug value would be equivalent to a configuration value from the following JSON file:

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

Pour accéder à ces valeurs de variables d’environnement, l’application doit simplement appeler AddEnvironmentVariables sur son ConfigurationBuilder pendant la construction d’un objet IConfigurationRoot.To access these values from environment variables, the application just needs to call AddEnvironmentVariables on its ConfigurationBuilder when constructing an IConfigurationRoot object.

Notez que les variables d’environnement sont couramment stockées en texte clair. Par conséquent, si la machine ou le processus comprenant les variables d’environnement est compromis, les valeurs des variables d’environnement sont visibles.Note that environment variables are commonly stored as plain text, so if the machine or process with the environment variables is compromised, the environment variable values will be visible.

Stocker des secrets à l’aide de l’outil Secret Manager d’ASP.NET CoreStore secrets with the ASP.NET Core Secret Manager

L’outil ASP.NET Core Secret Manager fournit une autre méthode pour garder les secrets hors du code source pendant le développement.The ASP.NET Core Secret Manager tool provides another method of keeping secrets out of source code during development. Pour utiliser l’outil Secret Manager, installez le package Microsoft.Extensions.Configuration.SecretManager dans votre fichier projet.To use the Secret Manager tool, install the package Microsoft.Extensions.Configuration.SecretManager in your project file. Une fois cette dépendance présente et restaurée, vous pouvez utiliser la commande dotnet user-secrets pour définir la valeur des secrets à partir de la ligne de commande.Once that dependency is present and has been restored, the dotnet user-secrets command can be used to set the value of secrets from the command line. Ces secrets sont alors stockés dans un fichier JSON dans le répertoire du profil de l’utilisateur (les détails varient selon le système d’exploitation), à l’écart du code source.These secrets will be stored in a JSON file in the user’s profile directory (details vary by OS), away from source code.

Les secrets définis par l’outil Secret Manager sont organisés par la propriété UserSecretsId du projet qui utilise les secrets.Secrets set by the Secret Manager tool are organized by the UserSecretsId property of the project that's using the secrets. Par conséquent, veillez à définir la propriété UserSecretsId dans votre fichier projet, comme indiqué dans l’extrait de code ci-dessous.Therefore, you must be sure to set the UserSecretsId property in your project file, as shown in the snippet below. La valeur par défaut est un GUID assigné par Visual Studio, mais la chaîne réelle n’a pas d’importance tant qu’elle est unique sur votre ordinateur.The default value is a GUID assigned by Visual Studio, but the actual string is not important as long as it's unique in your computer.

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

Pour utiliser les secrets stockés avec Secret Manager dans une application, AddUserSecrets<T> est appelé au niveau de l’instance ConfigurationBuilder. Les secrets de l’application sont alors inclus dans sa configuration.Using secrets stored with Secret Manager in an application is accomplished by calling AddUserSecrets<T> on the ConfigurationBuilder instance to include secrets for the application in its configuration. Le paramètre générique T doit être un type de l’assembly auquel UserSecretId a été appliqué.The generic parameter T should be a type from the assembly that the UserSecretId was applied to. Généralement, l’utilisation de AddUserSecrets<Startup> convient.Usually using AddUserSecrets<Startup> is fine.

AddUserSecrets<Startup>() est inclus dans les options par défaut pour l’environnement de développement lors de l’utilisation de la méthode CreateDefaultBuilder dans Program.cs.The AddUserSecrets<Startup>() is included in the default options for the Development environment when using the CreateDefaultBuilder method in Program.cs.