Dela via


Säker lagring av apphemligheter under utveckling i ASP.NET Core

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Rick Anderson och Kirk Larkin

Visa eller ladda ned exempelkod (hur du laddar ned)

Den här artikeln beskriver hur du hanterar känsliga data för en ASP.NET Core-app på en utvecklingsdator. Lagra aldrig lösenord eller andra känsliga data i källkods- eller konfigurationsfiler. Produktionshemligheter ska inte användas för utveckling eller testning. Hemligheter ska inte distribueras med appen. Produktionshemligheter bör nås via ett kontrollerat sätt som Azure Key Vault. Azure-test- och produktionshemligheter kan lagras och skyddas med Azure Key Vault-konfigurationsprovidern.

Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.

Information om hur du använder användarhemligheter i en .NET-konsolapp finns i det här GitHub-problemet.

Miljövariabler

Miljövariabler används för att undvika lagring av apphemligheter i kod eller i lokala konfigurationsfiler. Miljövariabler åsidosätter konfigurationsvärden för alla tidigare angivna konfigurationskällor.

Överväg en ASP.NET Core-webbapp där säkerhet för enskilda konton är aktiverat. En standardsträng för databasanslutning ingår i projektets appsettings.json fil med nyckeln DefaultConnection. Standardanslutningssträngen är för LocalDB, som körs i användarläge och inte kräver något lösenord. Under apputvecklingen DefaultConnection kan nyckelvärdet åsidosättas med en miljövariabels värde. Miljövariabeln kan lagra den fullständiga anslutningssträngen med känsliga autentiseringsuppgifter.

Varning

Miljövariabler lagras vanligtvis i oformaterad, okrypterad text. Om datorn eller processen komprometteras kan miljövariabler nås av ej betrodda parter. Ytterligare åtgärder för att förhindra avslöjande av användarhemligheter kan krävas.

Den : avgränsaren fungerar inte med hierarkiska nycklar för miljövariabler på alla plattformar. Till exempel stöds inte :-avgränsaren av Bash. Det dubbla understrecket, __, är:

  • Stöds av alla plattformar.
  • Ersätts automatiskt av ett kolon, :.

Hemlighetsansvarig

Secret Manager-verktyget lagrar känsliga data under programutvecklingen. I det här sammanhanget är en del av känsliga data en apphemlighet. Apphemligheter lagras på en separat plats från projektträdet. Apphemligheterna är associerade med ett specifikt projekt eller delas mellan flera projekt. Apphemligheterna är inte incheckade i källkontrollen.

Varning

Secret Manager-verktyget krypterar inte de lagrade hemligheterna och bör inte behandlas som ett betrott arkiv. Det är endast i utvecklingssyfte. Nycklarna och värdena lagras i en JSON-konfigurationsfil i användarprofilkatalogen.

Så här fungerar Secret Manager-verktyget

Secret Manager-verktyget döljer implementeringsinformation, till exempel var och hur värdena lagras. Du kan använda verktyget utan att känna till den här implementeringsinformationen. Värdena lagras i en JSON-fil i den lokala datorns användarprofilmapp:

Filsystemets sökväg

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

I föregående filsökvägar ersätter du <user_secrets_id> med det UserSecretsId värde som anges i projektfilen.

Skriv inte kod som är beroende av platsen eller formatet för data som sparats med Secret Manager-verktyget. Den här implementeringsinformationen kan ändras. Till exempel krypteras inte de hemliga värdena.

Aktivera hemlig lagring

Secret Manager-verktyget fungerar med projektspecifika konfigurationsinställningar som lagras i din användarprofil.

Använda CLI

Secret Manager-verktyget innehåller ett init kommando. Om du vill använda användarhemligheter kör du följande kommando i projektkatalogen:

dotnet user-secrets init

Föregående kommando lägger till ett UserSecretsId element i en PropertyGroup av projektfilen. Som standard är den inre texten av UserSecretsId en GUID. Den inre texten är godtycklig, men är unik för projektet.

Konfigurationen av UserSecretsId MSBuild-egenskap i appens projektfil.

Använda Visual Studio

Högerklicka på projektet i Solution Explorer i Visual Studio och välj Hantera användarhemligheter på snabbmenyn. Den här gesten lägger till ett UserSecretsId element, fyllt med ett GUID, i projektfilen.

Om GenerateAssemblyInfo är false

Om genereringen av sammansättningsinformationsattribut är inaktiverad lägger du manuellt till UserSecretsIdAttribute i AssemblyInfo.cs. Till exempel:

[assembly: UserSecretsId("your_user_secrets_id")]

När du lägger till UserSecretsId attributet manuellt i AssemblyInfo.csUserSecretsId måste värdet matcha värdet i projektfilen.

Ange en hemlighet

Definiera en apphemlighet som består av en nyckel och dess värde. Hemligheten är associerad med projektets UserSecretsId värde. Kör till exempel följande kommando från katalogen där projektfilen finns:

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

I föregående exempel anger kolonet att Movies är en objekt litera med en ServiceApiKey egenskap.

Secret Manager-verktyget kan också användas från andra kataloger. Använd alternativet --project för att ange den filsystemsökväg där projektfilen finns. Till exempel:

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

Utplattad JSON-struktur i Visual Studio

Gesten Hantera användarhemligheter i Visual Studio öppnar en secrets.json fil i textredigeraren. Ersätt innehållet i secrets.json med de nyckel/värde-par som ska lagras. Till exempel:

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

JSON-strukturen plattas ut efter ändringar via dotnet user-secrets remove eller dotnet user-secrets set. Om du till exempel kör dotnet user-secrets remove "Movies:ConnectionString" komprimeras objektliteralen Movies . Den ändrade filen liknar följande JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Ange flera hemligheter

Du kan ange en batch med hemligheter genom att skicka JSON till set kommandot . I följande exempel input.json skickas filens innehåll till set kommandot .

Öppna ett kommandogränssnitt och kör följande kommando:

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

Få åtkomst till en hemlighet

Utför följande steg för att komma åt en hemlighet:

  1. Registrera konfigurationskällan för användarhemligheter
  2. Läs hemligheten via konfigurations-API:et

Registrera konfigurationskällan för användarhemligheter

Konfigurationsprovidern för användarhemligheter registrerar den lämpliga konfigurationskällan med .NET-konfigurations-API:et.

ASP.NET Core-webbappar som skapats med dotnet new eller Visual Studio genererar följande kod:

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

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

app.Run();

WebApplication.CreateBuilder initierar en ny instans av klassen WebApplicationBuilder med förkonfigurerade standardvärden. Den initierade WebApplicationBuilder (builder) tillhandahåller standardkonfiguration och anropar AddUserSecrets när EnvironmentName är Development:

Läs hemligheten via konfigurations-API:et

Tänk dig följande exempel på hur du Movies:ServiceApiKey läser nyckeln:

Program.cs-filen:

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

var app = builder.Build();

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

app.Run();

Razor Sidmodell för sidor:

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
    }
}

Mer information finns i Konfiguration i ASP.NET Core.

Mappa hemlig information till en POCO

Att mappa en hel objektliteral till en POCO (en enkel .NET-klass med egenskaper) är användbart för att aggregera relaterade egenskaper.

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Om du vill mappa föregående hemligheter till en POCO använder du .NET Configuration API:s objektdiagrambindningsfunktion . Följande kod binder till en anpassad MovieSettings POCO och får åtkomst till egenskapsvärdet ServiceApiKey :

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

Hemligheterna Movies:ConnectionString och Movies:ServiceApiKey mappas till respektive egenskaper i MovieSettings:

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

    public string ServiceApiKey { get; set; }
}

Strängersättning med hemligheter

Det är osäkert att lagra lösenord i oformaterad text. Lagra aldrig hemligheter i en konfigurationsfil, till exempel appsettings.json, som kan checkas in på en källkodslagringsplats.

En databasanslutningssträng som lagras i appsettings.json bör till exempel inte innehålla något lösenord. Lagra istället lösenordet som en hemlighet och inkludera lösenordet i anslutningssträngen vid körning. Till exempel:

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

<secret value> Ersätt platshållaren i föregående exempel med lösenordsvärdet. Ange hemlighetens värde på ett SqlConnectionStringBuilder objekts egenskap så att det inkluderas Password som lösenordsvärde i anslutningssträngen:

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();

Visa en lista över hemligheter

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets list

Följande utdata visas:

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

I föregående exempel anger ett kolon i nyckelnamn objekthierarkin i secrets.json.

Ta bort en enda hemlighet

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets remove "Movies:ConnectionString"

secrets.json-filen i appen ändrades för att ta bort nyckel/värde-paret som är associerat med Movies:ConnectionString-nyckeln:

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

dotnet user-secrets list visar följande meddelande:

Movies:ServiceApiKey = 12345

Ta bort alla hemligheter

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets clear

Alla användarhemligheter för appen har tagits bort från secrets.json filen:

{}

När du kör dotnet user-secrets list visas följande meddelande:

No secrets configured for this application.

Hantera användarhemligheter med Visual Studio

Om du vill hantera användarhemligheter i Visual Studio högerklickar du på projektet i Solution Explorer och väljer Hantera användarhemligheter:

Visual Studio som visar Hantera användarhemligheter

Migrera användarhemligheter från ASP.NET Framework till ASP.NET Core

Se det här GitHub-problemet.

Användarhemligheter i icke-webbprogram

Projekt som har som mål Microsoft.NET.Sdk.Web inkluderar automatiskt stöd för användarhemligheter. För projekt som riktar sig till Microsoft.NET.Sdk, till exempel konsolprogram, installerar du konfigurationstillägget och NuGet-paketen för användarhemligheter explicit.

Med PowerShell:

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

Använda .NET CLI:

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

När paketen har installerats initierar du projektet och anger hemligheter på samma sätt som för en webbapp. I följande exempel visas ett konsolprogram som hämtar värdet för en hemlighet som har angetts med nyckeln "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"]);
    }
}

Ytterligare resurser

Av Rick Anderson, Kirk Larkin, Daniel Roth och Scott Addie

Visa eller ladda ned exempelkod (hur du laddar ned)

Den här artikeln beskriver hur du hanterar känsliga data för en ASP.NET Core-app på en utvecklingsdator. Lagra aldrig lösenord eller andra känsliga data i källkods- eller konfigurationsfiler. Produktionshemligheter ska inte användas för utveckling eller testning. Hemligheter ska inte distribueras med appen. Produktionshemligheter bör nås via ett kontrollerat sätt som Azure Key Vault. Azure-test- och produktionshemligheter kan lagras och skyddas med Azure Key Vault-konfigurationsprovidern.

Mer information om autentisering för test- och produktionsmiljöer finns i Skydda autentiseringsflöden.

Miljövariabler

Miljövariabler används för att undvika lagring av apphemligheter i kod eller i lokala konfigurationsfiler. Miljövariabler åsidosätter konfigurationsvärden för alla tidigare angivna konfigurationskällor.

Överväg en ASP.NET Core-webbapp där säkerhet för enskilda användarkonton är aktiverat. En standardsträng för databasanslutning ingår i projektets appsettings.json fil med nyckeln DefaultConnection. Standardanslutningssträngen är för LocalDB, som körs i användarläge och inte kräver något lösenord. Under apputvecklingen DefaultConnection kan nyckelvärdet åsidosättas med en miljövariabels värde. Miljövariabeln kan lagra den fullständiga anslutningssträngen med känsliga autentiseringsuppgifter.

Varning

Miljövariabler lagras vanligtvis i oformaterad, okrypterad text. Om datorn eller processen komprometteras kan miljövariabler nås av ej betrodda parter. Ytterligare åtgärder för att förhindra avslöjande av användarhemligheter kan krävas.

Den : avgränsaren fungerar inte med hierarkiska nycklar för miljövariabler på alla plattformar. Till exempel stöds inte :-avgränsaren av Bash. Det dubbla understrecket, __, är:

  • Stöds av alla plattformar.
  • Ersätts automatiskt av ett kolon, :.

Hemlighetsansvarig

Secret Manager-verktyget lagrar känsliga data under programutvecklingen. I det här sammanhanget är en del av känsliga data en apphemlighet. Apphemligheter lagras på en separat plats från projektträdet. Apphemligheterna är associerade med ett specifikt projekt eller delas mellan flera projekt. Apphemligheterna är inte incheckade i källkontrollen.

Varning

Secret Manager-verktyget krypterar inte de lagrade hemligheterna och bör inte behandlas som ett betrott arkiv. Det är endast i utvecklingssyfte. Nycklarna och värdena lagras i en JSON-konfigurationsfil i användarprofilkatalogen.

Så här fungerar Secret Manager-verktyget

Secret Manager-verktyget döljer implementeringsinformation, till exempel var och hur värdena lagras. Du kan använda verktyget utan att känna till den här implementeringsinformationen. Värdena lagras i en JSON-fil i den lokala datorns användarprofilmapp:

Filsystemets sökväg

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

I föregående filsökvägar ersätter du <user_secrets_id> med det UserSecretsId värde som anges i projektfilen.

Skriv inte kod som är beroende av platsen eller formatet för data som sparats med Secret Manager-verktyget. Den här implementeringsinformationen kan ändras. Till exempel krypteras inte de hemliga värdena, men kan finnas i framtiden.

Aktivera hemlig lagring

Secret Manager-verktyget fungerar med projektspecifika konfigurationsinställningar som lagras i din användarprofil.

Secret Manager-verktyget innehåller ett init kommando i .NET Core SDK 3.0.100 eller senare. Om du vill använda användarhemligheter kör du följande kommando i projektkatalogen:

dotnet user-secrets init

Föregående kommando lägger till ett UserSecretsId element i en PropertyGroup av projektfilen. Som standard är den inre texten av UserSecretsId en GUID. Den inre texten är godtycklig, men är unik för projektet.

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

Högerklicka på projektet i Solution Explorer i Visual Studio och välj Hantera användarhemligheter på snabbmenyn. Den här gesten lägger till ett UserSecretsId element, fyllt med ett GUID, i projektfilen.

Ange en hemlighet

Definiera en apphemlighet som består av en nyckel och dess värde. Hemligheten är associerad med projektets UserSecretsId värde. Kör till exempel följande kommando från katalogen där projektfilen finns:

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

I föregående exempel anger kolonet att Movies är en objekt litera med en ServiceApiKey egenskap.

Secret Manager-verktyget kan också användas från andra kataloger. Använd alternativet --project för att ange den filsystemsökväg där projektfilen finns. Till exempel:

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

Utplattad JSON-struktur i Visual Studio

Gesten Hantera användarhemligheter i Visual Studio öppnar en secrets.json fil i textredigeraren. Ersätt innehållet i secrets.json med de nyckel/värde-par som ska lagras. Till exempel:

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

JSON-strukturen plattas ut efter ändringar via dotnet user-secrets remove eller dotnet user-secrets set. Om du till exempel kör dotnet user-secrets remove "Movies:ConnectionString" komprimeras objektliteralen Movies . Den ändrade filen liknar följande JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Ange flera hemligheter

Du kan ange en batch med hemligheter genom att skicka JSON till set kommandot . I följande exempel input.json skickas filens innehåll till set kommandot .

Öppna ett kommandogränssnitt och kör följande kommando:

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

Få åtkomst till en hemlighet

Utför följande steg för att komma åt en hemlighet:

  1. Registrera konfigurationskällan för användarhemligheter
  2. Läs hemligheten via konfigurations-API:et

Registrera konfigurationskällan för användarhemligheter

Konfigurationsprovidern för användarhemligheter registrerar den lämpliga konfigurationskällan med .NET-konfigurations-API:et.

Konfigurationskällan för användarhemligheter läggs automatiskt till i utvecklingsläge när projektet anropar CreateDefaultBuilder. CreateDefaultBuilder anropar AddUserSecrets när EnvironmentName är Development:

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

När CreateDefaultBuilder anropas inte lägger du uttryckligen till konfigurationskällan för användarhemligheter genom att anropa AddUserSecrets i ConfigureAppConfiguration. Anropa AddUserSecrets endast när appen körs i utvecklingsmiljön, som du ser i följande exempel:

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();
    }
}

Läs hemligheten via konfigurations-API:et

Om konfigurationskällan för användarhemligheter är registrerad kan .NET-konfigurations-API:et läsa hemligheterna. Konstruktorinmatning kan användas för att få åtkomst till .NET Configuration API. Tänk dig följande exempel på hur du Movies:ServiceApiKey läser nyckeln:

Startklass:

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 Sidmodell för sidor:

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
    }
}

För mer information, se Åtkomstkonfiguration i Startup och Åtkomstkonfiguration i Razor Sidor.

Mappa hemlig information till en POCO

Att mappa en hel objektliteral till en POCO (en enkel .NET-klass med egenskaper) är användbart för att aggregera relaterade egenskaper.

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Om du vill mappa föregående hemligheter till en POCO använder du .NET Configuration API:s objektdiagrambindningsfunktion . Följande kod binder till en anpassad MovieSettings POCO och får åtkomst till egenskapsvärdet ServiceApiKey :

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

Hemligheterna Movies:ConnectionString och Movies:ServiceApiKey mappas till respektive egenskaper i MovieSettings:

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

    public string ServiceApiKey { get; set; }
}

Strängersättning med hemligheter

Det är osäkert att lagra lösenord i oformaterad text. Lagra aldrig hemligheter i en konfigurationsfil, till exempel appsettings.json, som kan checkas in på en källkodslagringsplats.

En databasanslutningssträng som lagras i appsettings.json bör till exempel inte innehålla något lösenord. Lagra istället lösenordet som en hemlighet och inkludera lösenordet i anslutningssträngen vid körning. Till exempel:

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

<secret value> Ersätt platshållaren i föregående exempel med lösenordsvärdet. Ange hemlighetens värde på ett SqlConnectionStringBuilder objekts egenskap så att det inkluderas Password som lösenordsvärde i anslutningssträngen:

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();

Visa en lista över hemligheter

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets list

Följande utdata visas:

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

I föregående exempel anger ett kolon i nyckelnamn objekthierarkin i secrets.json.

Ta bort en enda hemlighet

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets remove "Movies:ConnectionString"

secrets.json-filen i appen ändrades för att ta bort nyckel/värde-paret som är associerat med MoviesConnectionString-nyckeln:

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

dotnet user-secrets list visar följande meddelande:

Movies:ServiceApiKey = 12345

Ta bort alla hemligheter

Anta att appens secrets.json fil innehåller följande två hemligheter:

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

Kör följande kommando från katalogen där projektfilen finns:

dotnet user-secrets clear

Alla användarhemligheter för appen har tagits bort från secrets.json filen:

{}

När du kör dotnet user-secrets list visas följande meddelande:

No secrets configured for this application.

Hantera användarhemligheter med Visual Studio

Om du vill hantera användarhemligheter i Visual Studio högerklickar du på projektet i Solution Explorer och väljer Hantera användarhemligheter:

Visual Studio som visar Hantera användarhemligheter

Migrera användarhemligheter från ASP.NET Framework till ASP.NET Core

Se det här GitHub-problemet.

Användarhemligheter i icke-webbprogram

Projekt som har som mål Microsoft.NET.Sdk.Web inkluderar automatiskt stöd för användarhemligheter. För projekt som riktar sig till Microsoft.NET.Sdk, till exempel konsolprogram, installerar du konfigurationstillägget och NuGet-paketen för användarhemligheter explicit.

Med PowerShell:

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

Använda .NET CLI:

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

När paketen har installerats initierar du projektet och anger hemligheter på samma sätt som för en webbapp. I följande exempel visas ett konsolprogram som hämtar värdet för en hemlighet som har angetts med nyckeln "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"]);
    }
}

Ytterligare resurser