Stockage sécurisé des secrets d’application en développement dans ASP.NET Core

Note

Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 10 de cet article.

Warning

Cette version d’ASP.NET Core n’est plus prise en charge. Pour plus d’informations, consultez la stratégie de support .NET et .NET Core. Pour la version actuelle, consultez la version .NET 10 de cet article.

Par Rick Anderson et Kirk Larkin

Cet article explique comment gérer des données sensibles pour une application ASP.NET Core sur un ordinateur de développement. Ne stockez jamais de mots de passe ou d’autres données sensibles dans le code source ou les fichiers de configuration. Les secrets de production ne doivent pas être utilisés pour le développement ou les tests. Les secrets ne doivent pas être déployés avec l'application. Les secrets de production doivent être accessibles par le biais d’un moyen contrôlé comme Azure Key Vault. Les secrets de test et de production Azure peuvent être stockés et protégés avec le fournisseur de configuration Azure Key Vault.

Afficher ou télécharger l’exemple de code (comment télécharger)

Pour plus d’informations sur l’authentification pour les applications de test et de production déployées, consultez Flux d’authentification sécurisés.

Pour utiliser des secrets utilisateur dans une application console .NET, consultez GitHub dotnet/entityframework.docs issue #3939.

Utiliser des variables d’environnement

Les variables d'environnement sont utilisées pour éviter le stockage des secrets d'application dans le code ou dans les fichiers de configuration locaux. Les variables d'environnement remplacent les valeurs de configuration pour toutes les sources de configuration précédemment spécifiées.

Considérez une application web ASP.NET Core dans laquelle la sécurité des comptes individuels est activée. Une chaîne de connexion à la base de données par défaut est incluse dans le fichier appsettings.json du projet avec la clé DefaultConnection. La chaîne de connexion par défaut est pour Base de données locale, qui s'exécute en mode utilisateur et ne nécessite pas de mot de passe. Pendant le déploiement de l’application, vous pouvez remplacer la DefaultConnection valeur de clé par la valeur d’une variable d’environnement. La variable d’environnement peut stocker le chaîne de connexion complet avec des informations d’identification sensibles.

Warning

Les variables d’environnement sont généralement stockées sous forme de texte brut et non chiffré. Si l’ordinateur ou le processus est compromis, les variables d’environnement sont accessibles aux parties non approuvées. Des mesures supplémentaires pour empêcher la divulgation de secrets utilisateur peuvent être requises.

Le séparateur deux-points (:) ne fonctionne pas avec les clés hiérarchiques des variables d’environnement sur toutes les plateformes. Par exemple, Bash ne prend pas en charge le signe deux-points (:) comme séparateur. Toutes les plateformes prennent en charge la syntaxe de trait de soulignement double (__) et la remplacent automatiquement par un signe deux-points (:).

Utiliser l’outil Gestionnaire de secrets

Secret Manager est un outil qui stocke des données sensibles pendant le développement d’applications. Dans ce contexte, un élément de données sensibles est un secret d’application.

  • Les secrets d'application sont stockés dans un emplacement distinct de l'arborescence du projet.
  • Ils sont associés à un projet spécifique ou partagés entre plusieurs projets.
  • Ils ne sont pas enregistrés dans le système de gestion de versions.

Warning

Secret Manager ne chiffre pas les secrets stockés et ne doit pas être traité comme un magasin approuvé. C'est uniquement à des fins de développement. Les clés et les valeurs sont stockées dans un fichier de configuration JSON dans le répertoire du profil utilisateur.

Secret Manager masque les détails de l’implémentation, tels que l’emplacement et la façon dont les valeurs sont stockées. Vous pouvez utiliser l'outil sans connaître ces détails de mise en œuvre. Les valeurs sont stockées dans un fichier JSON dans le dossier de profil utilisateur de la machine locale :

Chemin du système de fichiers :

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Dans le chemin du système de fichiers, remplacez la <user_secrets_id> partie par la UserSecretsId valeur spécifiée dans votre fichier projet.

N’écrivez pas de code qui dépend de l’emplacement ou du format des données enregistrées avec Secret Manager. Ces détails d’implémentation peuvent changer. Par exemple, les valeurs secrètes ne sont pas chiffrées.

Activer le stockage secret

Secret Manager fonctionne sur les paramètres de configuration spécifiques au projet stockés dans votre profil utilisateur.

Utiliser l’interface CLI

Secret Manager inclut une init commande. Pour utiliser les secrets utilisateur, exécutez la commande suivante dans le répertoire du projet :

dotnet user-secrets init

Cette commande ajoute un UserSecretsId élément dans un PropertyGroup fichier projet. Par défaut, le texte interne de UserSecretsId est un GUID. Le texte intérieur est arbitraire, mais unique au projet. L’exemple suivant montre une valeur GUID de 0000a1a1-b2b2-c3c3-d4d4-eeeeee555555.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <UserSecretsId>0000a1a1-b2b2-c3c3-d4d4-eeeeee555555</UserSecretsId>
  </PropertyGroup>

</Project>

Utiliser Visual Studio

Dans Visual Studio, cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez Gérer les secrets utilisateur dans le menu contextuel. Ce geste ajoute un élément UserSecretsId, rempli d'un GUID, au fichier de projet.

Si « GenerateAssemblyInfo » est « false »

Si la génération des attributs d’informations d’assembly (GenerateAssemblyInfo) est désactivée (définie sur false), ajoutez manuellement le UserSecretsIdAttribute dans le fichier AssemblyInfo.cs. Par exemple:

[assembly: UserSecretsId("your_user_secrets_id")]

Lorsque vous ajoutez manuellement l’attribut UserSecretsId au fichier AssemblyInfo.cs , la UserSecretsId valeur doit correspondre à la valeur dans le fichier projet.

Définir un secret

Définissez un secret d'application composé d'une clé et de sa valeur. Le secret est associé à la valeur UserSecretsId du projet. Par exemple, exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Dans cet exemple, les deux-points indiquent qu’il s’agit de Movies un littéral d’objet avec une propriété ServiceApiKey.

Vous pouvez également utiliser Secret Manager à partir d’autres répertoires. Incluez l’option --project permettant de fournir le chemin du système de fichiers auquel le fichier projet existe. Par exemple:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

L’aplatissement de la structure JSON dans Visual Studio

Le mouvement Visual Studio Manage User Secrets ouvre un fichier secrets.json dans l’éditeur de texte. Remplacez le contenu du fichier secrets.json par les paires clé-valeur à stocker. Par exemple:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

La structure JSON est mise à plat après des modifications via la commande dotnet user-secrets remove ou dotnet user-secrets set. Par exemple, l'exécution de dotnet user-secrets remove "Movies:ConnectionString" réduit le littéral d'objet Movies. Le fichier modifié ressemble au JSON suivant :

{
  "Movies:ServiceApiKey": "12345"
}

Définir plusieurs secrets

Un lot de secrets peut être défini en redirigeant JSON vers la commande set. Dans l’exemple suivant, le contenu du fichier input.json est redirigé vers la set commande.

Exécutez la commande suivante:

type .\input.json | dotnet user-secrets set

Accéder à un secret

Pour accéder à un secret, procédez comme suit :

  1. Inscrivez la source de configuration des secrets utilisateur.

  2. Lisez le secret via l’API configuration.

Enregistrer la source de configuration des secrets d'utilisateur

Le fournisseur de configuration des secrets utilisateur enregistre la source de configuration appropriée avec l'API de configuration .NET.

Les applications web ASP.NET Core créées avec la commande dotnet new ou Visual Studio génèrent le code suivant :

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

La méthode WebApplication.CreateBuilder initialise une nouvelle instance de la WebApplicationBuilder classe avec des valeurs par défaut préconfigurées. L’élément initialisé WebApplicationBuilder (builder) fournit une configuration par défaut et appelle la méthode AddUserSecrets lorsque la propriété EnvironmentName est définie sur Development.

Lire le secret via l'API de configuration

Les exemples suivants montrent comment lire la Movies:ServiceApiKey clé :

le fichier Program.cs

var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];

var app = builder.Build();

app.MapGet("/", () => movieApiKey);

app.Run();

Razor Modèle de page Pages

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public void OnGet()
    {
        var moviesApiKey = _config["Movies:ServiceApiKey"];

        // call Movies service with the API key
    }
}

Pour plus d’informations, consultez Configuration dans ASP.NET Core.

Cartographier les secrets d'un POCO

Le mappage d'un littéral d'objet entier à un POCO (une classe .NET simple avec des propriétés) est utile pour agréger les propriétés associées.

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Pour mapper les secrets précédents à un POCO, utilisez la fonctionnalité de liaison de graphe d'objet de l'API de configuration .NET. Le code suivant se lie à un POCO personnalisé MovieSettings et accède à la valeur de la propriété ServiceApiKey :

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

Les secrets Movies:ConnectionString et Movies:ServiceApiKey sont mappés aux propriétés respectives dans MovieSettings :

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Utiliser le remplacement de chaîne avec des secrets

Le stockage des mots de passe en texte brut n'est pas sécurisé. Ne stockez jamais de secrets dans un fichier de configuration tel que appsettings.json, qui peut être archivé dans un référentiel de code source.

Par exemple, une base de données chaîne de connexion stockée dans un fichier appsettings.json ne doit pas inclure de mot de passe. Au lieu de cela, stockez le mot de passe en tant que secret et incluez le mot de passe dans le chaîne de connexion au moment de l’exécution. Par exemple:

dotnet user-secrets set "DbPassword" "`<secret value>`"

Remplacez l’espace réservé <secret value> dans l’exemple par la valeur du mot de passe. Définissez la valeur du secret sur la propriété d’un SqlConnectionStringBuilderPassword objet pour l’inclure comme valeur de mot de passe dans l’chaîne de connexion :

using System.Data.SqlClient;

var builder = WebApplication.CreateBuilder(args);

var conStrBuilder = new SqlConnectionStringBuilder(
        builder.Configuration.GetConnectionString("Movies"));
conStrBuilder.Password = builder.Configuration["DbPassword"];
var connection = conStrBuilder.ConnectionString;

var app = builder.Build();

app.MapGet("/", () => connection);

app.Run();

Lister les secrets

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets list

Vous obtenez la sortie suivante :

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Dans l’exemple, un signe deux-points (:) dans les noms de clés désigne la hiérarchie d’objets dans le fichier secrets.json .

Supprimer un seul secret

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets remove "Movies:ConnectionString"

Le fichier secrets.json application est modifié pour supprimer la paire clé-valeur associée à la Movies:ConnectionString clé :

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

La dotnet user-secrets list commande affiche le message suivant :

Movies:ServiceApiKey = 12345

Supprimer tous les secrets

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets clear

Tous les secrets utilisateur de l’application sont supprimés du fichier secrets.json :

{}

L’exécution de la dotnet user-secrets list commande affiche le message suivant :

No secrets configured for this application.

Gérer les secrets des utilisateurs avec Visual Studio

Pour gérer les secrets utilisateur dans Visual Studio, cliquez avec le bouton droit sur le projet dans Explorateur de solutions, puis sélectionnez Manage User Secrets :

Screenshot montre comment sélectionner l’option Gérer les secrets utilisateur dans Visual Studio.

Migrer les secrets utilisateur de ASP.NET Framework vers ASP.NET Core

Vous pouvez migrer vos secrets utilisateur stockés de ASP.NET Framework vers ASP.NET Core. Pour plus d'informations, consultez GitHub dotnet/aspnetcore.docs issue #27611 - Documentation sur les secrets d'utilisateur ne mentionne pas l'incompatibilité avec AssemblyInfo.cs.

Utiliser des secrets utilisateur dans des applications non web

Les projets qui ciblent Microsoft.NET.Sdk.Web incluent automatiquement la prise en charge des secrets utilisateur. Pour les projets qui ciblent Microsoft.NET.Sdk, tels que les applications console, installez explicitement les packages NuGet de l’extension de configuration et des secrets utilisateur.

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets

Après avoir installé les packages, initialisez le projet et définissez les secrets de la même façon que pour une application web. L’exemple suivant montre une application de console qui récupère la valeur d’un secret défini avec la clé AppSecret :

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddUserSecrets<Program>()
            .Build();

        Console.WriteLine(config["AppSecret"]);
    }
}

Par Rick Anderson, Kirk Larkin, Daniel Roth et Scott Addie

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

Cet article explique comment gérer des données sensibles pour une application ASP.NET Core sur un ordinateur de développement. Ne stockez jamais de mots de passe ou d’autres données sensibles dans le code source ou les fichiers de configuration. Les secrets de production ne doivent pas être utilisés pour le développement ou les tests. Les secrets ne doivent pas être déployés avec l'application. Les secrets de production doivent être accessibles par le biais d’un moyen contrôlé comme Azure Key Vault. Les secrets de test et de production Azure peuvent être stockés et protégés avec le fournisseur de configuration Azure Key Vault.

Pour plus d’informations sur l’authentification pour les environnements de test et de production, consultez Flux d’authentification sécurisés.

Variables d'environnement

Les variables d'environnement sont utilisées pour éviter le stockage des secrets d'application dans le code ou dans les fichiers de configuration locaux. Les variables d'environnement remplacent les valeurs de configuration pour toutes les sources de configuration précédemment spécifiées.

Considérez une application Web ASP.NET Core dans laquelle la sécurité des comptes d'utilisateurs individuels est activée. Une chaîne de connexions aux bases de données par défaut est incluse dans le fichier du projet appsettings.json avec la clé DefaultConnection. La chaîne de connexion par défaut est pour Base de données locale, qui s'exécute en mode utilisateur et ne nécessite pas de mot de passe. Lors du déploiement de l'application, la valeur de la clé DefaultConnection peut être remplacée par la valeur d'une variable d'environnement. La variable d'environnement peut stocker la chaîne de connexion complète avec des informations d'identification sensibles.

Warning

Les variables d'environnement sont généralement stockées en texte brut non crypté. Si la machine ou le processus est compromis, les variables d'environnement peuvent être consultées par des parties non fiables. Des mesures supplémentaires pour empêcher la divulgation de secrets d'utilisateur peuvent être nécessaires.

Le séparateur deux-points (:) ne fonctionne pas avec les clés hiérarchiques des variables d’environnement sur toutes les plateformes. Par exemple, Bash ne prend pas en charge le signe deux-points (:) comme séparateur. Toutes les plateformes prennent en charge la syntaxe de trait de soulignement double (__) et la remplacent automatiquement par un signe deux-points (:).

Gestionnaire de secrets

L’outil Secret Manager stocke les données sensibles pendant le développement des applications. Dans ce contexte, une donnée sensible est un secret d'application. Les secrets d'application sont stockés dans un emplacement distinct de l'arborescence du projet. Les secrets d'application sont associés à un projet spécifique ou partagés entre plusieurs projets. Les secrets de l'application ne sont pas vérifiés dans le contrôle de code source.

Warning

L'outil Secret Manager ne crypte pas les secrets stockés et ne doit pas être traité comme un magasin de confiance. C'est uniquement à des fins de développement. Les clés et les valeurs sont stockées dans un fichier de configuration JSON dans le répertoire du profil utilisateur.

Fonctionnement de l'outil Secret Manager

L'outil Secret Manager masque les détails de mise en œuvre, tels que l'emplacement et la manière dont les valeurs sont stockées. Vous pouvez utiliser l'outil sans connaître ces détails de mise en œuvre. Les valeurs sont stockées dans un fichier JSON dans le dossier de profil utilisateur de la machine locale :

Chemin du système de fichiers :

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

Dans les chemins de fichier précédents, remplacez <user_secrets_id> par la valeur spécifiée UserSecretsId dans le fichier de projet.

N'écrivez pas de code qui dépend de l'emplacement ou du format des données enregistrées avec l'outil Secret Manager. Ces détails de mise en œuvre peuvent changer. Par exemple, les valeurs secrètes ne sont pas chiffrées, mais pourraient l'être dans le futur.

Activer le stockage secret

L'outil Secret Manager fonctionne sur les paramètres de configuration spécifiques au projet stockés dans votre profil utilisateur.

L'outil Secret Manager inclut une commande init dans .NET Core SDK 3.0.100 ou version ultérieure. Pour utiliser les secrets utilisateur, exécutez la commande suivante dans le répertoire du projet :

dotnet user-secrets init

La commande précédente ajoute un élément UserSecretsId dans un PropertyGroup du fichier projet. Par défaut, le texte interne de UserSecretsId est un GUID. Le texte intérieur est arbitraire, mais unique au projet.

<PropertyGroup>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>

Dans Visual Studio, cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez Gérer les secrets utilisateur dans le menu contextuel. Ce geste ajoute un élément UserSecretsId, rempli d'un GUID, au fichier de projet.

Définir un secret

Définissez un secret d'application composé d'une clé et de sa valeur. Le secret est associé à la valeur UserSecretsId du projet. Par exemple, exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

Dans l'exemple précédent, les deux-points indiquent que Movies s'agit d'un objet littéral avec une propriété ServiceApiKey.

L'outil Secret Manager peut également être utilisé à partir d'autres répertoires. Utilisez l'option --project pour fournir le chemin du système de fichiers dans lequel le fichier de projet existe. Par exemple:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

L’aplatissement de la structure JSON dans Visual Studio

L'action Gérer les secrets utilisateur de Visual Studio ouvre un fichier secrets.json dans l'éditeur de texte. Remplacez le contenu de secrets.json par les paires clé-valeur à stocker. Par exemple:

{
  "Movies": {
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
    "ServiceApiKey": "12345"
  }
}

La structure JSON est mise à plat après modifications via dotnet user-secrets remove ou dotnet user-secrets set. Par exemple, l'exécution de dotnet user-secrets remove "Movies:ConnectionString" réduit le littéral d'objet Movies. Le fichier modifié ressemble au JSON suivant :

{
  "Movies:ServiceApiKey": "12345"
}

Définir plusieurs secrets

Un lot de secrets peut être défini en redirigeant JSON vers la commande set. Dans l'exemple suivant, le contenu du fichier input.json est redirigé vers la commande set.

Ouvrez un shell de commande et exécutez la commande suivante :

type .\input.json | dotnet user-secrets set

Accéder à un secret

Pour accéder à un secret, procédez comme suit :

  1. Enregistrer la source de configuration des secrets d'utilisateur
  2. Lire le secret via l'API de configuration

Enregistrer la source de configuration des secrets d'utilisateur

Le fournisseur de configuration des secrets utilisateur enregistre la source de configuration appropriée avec l'API de configuration .NET.

La source de configuration des secrets utilisateur est automatiquement ajoutée en mode Développement lorsque le projet appelle CreateDefaultBuilder. CreateDefaultBuilder appelle AddUserSecrets quand EnvironmentName est Development :

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Lorsque CreateDefaultBuilder n'est pas appelé, ajoutez explicitement la source de configuration des secrets d'utilisateur AddUserSecrets en appelant ConfigureAppConfiguration. Appelez AddUserSecrets uniquement lorsque l’application s’exécute dans l’environnement Development , comme illustré dans l’exemple suivant :

public class Program
{
    public static void Main(string[] args)
    {
        var host = new HostBuilder()
            .ConfigureAppConfiguration((hostContext, builder) =>
            {
                // Add other providers for JSON, etc.

                if (hostContext.HostingEnvironment.IsDevelopment())
                {
                    builder.AddUserSecrets<Program>();
                }
            })
            .Build();
        
        host.Run();
    }
}

Lire le secret via l'API de configuration

Si la source de configuration des secrets utilisateur est enregistrée, l'API de configuration .NET peut lire les secrets. L'injection de constructeur peut être utilisée pour accéder à l'API de configuration .NET. Considérez les exemples suivants de lecture de la clé Movies:ServiceApiKey :

Classe de démarrage :

public class Startup
{
    private string _moviesApiKey = null;

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        _moviesApiKey = Configuration["Movies:ServiceApiKey"];
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            var result = string.IsNullOrEmpty(_moviesApiKey) ? "Null" : "Not Null";
            await context.Response.WriteAsync($"Secret is {result}");
        });
    }
}

Razor Modèle de pages :

public class IndexModel : PageModel
{
    private readonly IConfiguration _config;

    public IndexModel(IConfiguration config)
    {
        _config = config;
    }

    public void OnGet()
    {
        var moviesApiKey = _config["Movies:ServiceApiKey"];

        // call Movies service with the API key
    }
}

Pour plus d'informations, consultez Configuration de l'accès dans Démarrage et Configuration de l'accès dans Razor Pages.

Cartographier les secrets d'un POCO

Le mappage d'un littéral d'objet entier à un POCO (une classe .NET simple avec des propriétés) est utile pour agréger les propriétés associées.

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Pour mapper les secrets précédents à un POCO, utilisez la fonctionnalité de liaison de graphe d'objet de l'API de configuration .NET. Le code suivant se lie à un POCO personnalisé MovieSettings et accède à la valeur de la propriété ServiceApiKey :

var moviesConfig = 
    Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;

Les secrets Movies:ConnectionString et Movies:ServiceApiKey sont mappés aux propriétés respectives dans MovieSettings :

public class MovieSettings
{
    public string ConnectionString { get; set; }

    public string ServiceApiKey { get; set; }
}

Remplacement de chaîne de caractères par des secrets

Le stockage des mots de passe en texte brut n'est pas sécurisé. Ne stockez jamais de secrets dans un fichier de configuration tel que appsettings.json, qui peut être archivé dans un référentiel de code source.

Par exemple, une chaîne de connexion de base de données stockée dans appsettings.json ne doit pas inclure de mot de passe. Au lieu de cela, stockez le mot de passe en tant que secret et incluez le mot de passe dans le chaîne de connexion au moment de l’exécution. Par exemple:

dotnet user-secrets set "DbPassword" "<secret value>"

Remplacez l'espace réservé <secret value> dans l'exemple précédent par la valeur du mot de passe. Définissez la valeur du secret sur la propriété d’un SqlConnectionStringBuilderPassword objet pour l’inclure comme valeur de mot de passe dans l’chaîne de connexion :

using System.Data.SqlClient;

var builder = WebApplication.CreateBuilder(args);

var conStrBuilder = new SqlConnectionStringBuilder(
        builder.Configuration.GetConnectionString("Movies"));
conStrBuilder.Password = builder.Configuration["DbPassword"];
var connection = conStrBuilder.ConnectionString;

var app = builder.Build();

app.MapGet("/", () => connection);

app.Run();

Lister les secrets

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets list

Vous obtenez la sortie suivante :

Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345

Dans l'exemple précédent, deux-points dans les noms de clé indiquent la hiérarchie d'objets dans secrets.json.

Supprimer un seul secret

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets remove "Movies:ConnectionString"

Le fichier de l'application secrets.json a été modifié pour supprimer la paire clé-valeur associée à la clé MoviesConnectionString :

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

dotnet user-secrets list affiche le message suivant :

Movies:ServiceApiKey = 12345

Supprimer tous les secrets

Supposons que le fichier secrets.json de l’application contient les deux secrets suivants :

{
  "Movies:ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true",
  "Movies:ServiceApiKey": "12345"
}

Exécutez la commande suivante à partir du répertoire dans lequel se trouve le fichier projet :

dotnet user-secrets clear

Tous les secrets d'utilisateur de l'application ont été supprimés du fichier secrets.json :

{}

L'exécution dotnet user-secrets list affiche le message suivant :

No secrets configured for this application.

Gérer les secrets des utilisateurs avec Visual Studio

Pour gérer les secrets d'utilisateur dans Visual Studio, cliquez avec le bouton droit sur le projet dans l'explorateur de solutions et sélectionnez Gérer les secrets d'utilisateur :

Visual Studio montrant Gérer les secrets d'utilisateur

Migration des secrets utilisateur d'ASP.NET Framework vers ASP.NET Core

Consultez ce problème GitHub.

Secrets utilisateur dans les applications non-web

Les projets qui ciblent Microsoft.NET.Sdk.Web incluent automatiquement la prise en charge des secrets utilisateur. Pour les projets qui ciblent Microsoft.NET.Sdk, tels que les applications console, installez explicitement les packages NuGet de l’extension de configuration et des secrets utilisateur.

Utilisation de PowerShell :

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.UserSecrets

Utilisation de l’interface CLI .NET :

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.UserSecrets

Une fois que les packages sont installés, initialisez le projet et définissez les secrets de la même façon que pour une application web. L’exemple suivant montre une application console qui récupère la valeur d’un secret qui a été défini avec la clé « AppSecret » :

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

class Program
{
    static void Main(string[] args)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddUserSecrets<Program>()
            .Build();

        Console.WriteLine(config["AppSecret"]);
    }
}

Ressources supplémentaires