Bezpečné ukládání tajných kódů aplikací při vývoji v ASP.NET Core

Note

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.

Warning

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.

Autoři: Rick Anderson a Kirk Larkin

Tento článek vysvětluje, jak spravovat citlivá data pro aplikaci ASP.NET Core na vývojovém počítači. Nikdy neukládejte hesla ani jiná citlivá data ve zdrojovém kódu nebo konfiguračních souborech. Produkční tajné kódy by se neměly používat pro vývoj ani testování. Tajné kódy by se neměly nasazovat s aplikací. Produkční tajné kódy by měly být přístupné prostřednictvím kontrolovaných prostředků, jako je Azure Key Vault. Testovací a produkční tajné kódy Azure je možné ukládat a chránit pomocí poskytovatele konfigurace služby Azure Key Vault.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Další informace o ověřování nasazených testovacích a produkčních aplikacích naleznete v Bezpečné toky autentizace.

Informace o používání uživatelských tajných údajů v konzolové aplikaci .NET najdete v problému GitHub dotnet/entityframework.docs č. 3939.

Práce s proměnnými prostředí

Proměnné prostředí se používají k tomu, aby se zabránilo ukládání tajných kódů aplikací v kódu nebo v místních konfiguračních souborech. Proměnné prostředí převyšují hodnoty konfigurace pro všechny dříve zadané zdroje konfigurace.

Zvažte ASP.NET základní webovou aplikaci, ve které je povolené zabezpečení jednotlivých účtů . Výchozí připojovací řetězec databáze je obsažen v souboru appsettings.json projektu pod klíčem DefaultConnection. Výchozí připojovací řetězec je pro LocalDB, která běží v uživatelském režimu a nevyžaduje heslo. Během nasazování aplikace můžete hodnotu klíče DefaultConnection přepsat hodnotou z proměnné prostředí. Proměnná prostředí může uložit kompletní připojovací řetězec s citlivými přihlašovacími údaji.

Warning

Proměnné prostředí se běžně ukládají jako prostý, nešifrovaný text. Pokud dojde k ohrožení zabezpečení počítače nebo procesu, jsou proměnné prostředí přístupné nedůvěryhodným stranám. Může se vyžadovat další opatření, která brání zpřístupnění tajných kódů uživatelů.

Oddělovač dvojtečky (:) nefunguje u hierarchických klíčů proměnných prostředí na všech platformách. Například Bash nepodporuje dvojtečku (:) jako oddělovač. Všechny platformy podporují syntaxi dvojitého podtržítka (__) a automaticky ji nahradí dvojtečkam (:).

Použití nástroje Secret Manager

Secret Manager je nástroj, který ukládá citlivá data během vývoje aplikací. V tomto kontextu je část citlivých dat tajným kódem aplikace.

  • Tajemství aplikací jsou ukládána na samostatné umístění než strom projektu.
  • Jsou přidružené ke konkrétnímu projektu nebo jsou sdíleny napříč několika projekty.
  • Nejsou zařazeny do systému správy zdrojového kódu.

Warning

Správce tajných kódů nešifruje uložené tajné kódy a neměl by se považovat za důvěryhodné úložiště. Slouží pouze pro účely vývoje. Klíče a hodnoty jsou uloženy v konfiguračním souboru JSON v adresáři profilu uživatele.

Správce tajných kódů skryje podrobnosti implementace, například kde a jak se hodnoty ukládají. Nástroj můžete použít bez znalosti těchto podrobností implementace. Hodnoty se ukládají do souboru JSON ve složce profilu uživatele místního počítače:

Cesta souborového systému

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

V cestě k souborovému systému nahraďte část <user_secrets_id> hodnotou UserSecretsId zadanou v souboru projektu.

Nezapisujte kód, který závisí na umístění nebo formátu dat uložených ve Správci tajných kódů. Tyto podrobnosti implementace se můžou změnit. Například tajné hodnoty nejsou šifrované.

Povolení úložiště tajných kódů

Správce tajných kódů pracuje s nastavením konfigurace pro konkrétní projekt uloženými ve vašem profilu uživatele.

Použijte rozhraní příkazového řádku

Secret Manager obsahuje příkaz init. Pokud chcete používat tajné kódy uživatelů, spusťte v adresáři projektu následující příkaz:

dotnet user-secrets init

Tento příkaz přidá UserSecretsId prvek do PropertyGroup souboru projektu. Ve výchozím nastavení je vnitřní text UserSecretsId identifikátoru GUID. Vnitřní text je libovolný, ale je jedinečný pro projekt. Následující příklad ukazuje hodnotu identifikátoru GUID 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>

Použití sady Visual Studio

V sadě Visual Studio klikněte pravým tlačítkem myši na projekt v Průzkumníku řešení a v místní nabídce vyberte Spravovat tajnosti uživatele. Toto gesto přidá do souboru projektu prvek UserSecretsId, který je naplněný identifikátorem GUID.

Pokud je „GenerateAssemblyInfo“ „false“

Pokud je generování atributů informací o sestavení (GenerateAssemblyInfo) zakázané (nastaveno na false), přidejte UserSecretsIdAttribute ručně do souboru AssemblyInfo.cs . Například:

[assembly: UserSecretsId("your_user_secrets_id")]

Při ručním přidání UserSecretsId atributu do souboru UserSecretsId musí hodnota odpovídat hodnotě v souboru projektu.

Nastavení tajného kódu

Definujte tajný klíč aplikace, který se skládá z klíče a jeho hodnoty. Tajemství je spojeno s hodnotou projektu UserSecretsId. Například z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

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

V tomto příkladu dvojtečka označuje, že Movies je objektový literál s vlastností ServiceApiKey.

Můžete také použít Secret Manager z jiných adresářů. --project Zahrňte možnost zadat cestu k systému souborů, ve které existuje soubor projektu. Například:

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

Zploštění struktury JSON v prostředí Visual Studio

Gesto Visual Studio Manage User Secrets otevře v textovém editoru soubor secrets.json. Obsah souboru secrets.json nahraďte páry klíč–hodnota určenými k uložení. Například:

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

Struktura JSON je po úpravách zploštěna pomocí dotnet user-secrets remove příkazu nebo dotnet user-secrets set příkazu. Například spuštění dotnet user-secrets remove "Movies:ConnectionString" sbalí objektový literál Movies. Upravený soubor se podobá následujícímu formátu JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Nastavení více tajných kódů

Dávku tajných kódů lze nastavit tak, že do set příkazu prodáte kód JSON. V následujícím příkladu se obsah souboru input.json předá do set příkazu.

Spusťte následující příkaz:

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

Přístup k tajnému kódu

Pokud chcete získat přístup k tajnému kódu, proveďte následující kroky:

  1. Zaregistrujte zdroj konfigurace tajných kódů uživatele.

  2. Přečtěte si tajný klíč prostřednictvím konfiguračního rozhraní API.

Registrace zdroje konfigurace uživatelských tajemství

Poskytovatel konfigurace uživatelských tajemství zaregistruje příslušný zdroj konfigurace v rozhraní .NET Configuration API.

ASP.NET Core webové aplikace vytvořené pomocí příkazu dotnet new nebo v aplikaci Visual Studio generují následující kód:

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

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

app.Run();

Metoda WebApplication.CreateBuilder inicializuje novou instanci WebApplicationBuilder třídy s předkonfigurovanými výchozími nastaveními. Inicializovaná WebApplicationBuilder (builder) poskytuje výchozí konfiguraci a volá metodu AddUserSecrets, pokud má vlastnost EnvironmentName hodnotu Development.

Čtení tajného kódu prostřednictvím konfiguračního rozhraní API

Následující příklady ukazují, jak přečíst Movies:ServiceApiKey klíč:

Program.cs soubor

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

var app = builder.Build();

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

app.Run();

Razor Model stránky 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
    }
}

Další informace najdete v tématu Konfigurace v ASP.NET Core.

Mapování tajností na POCO

Mapování celého literálu objektu na POCO (jednoduchá třída .NET s vlastnostmi) je užitečné pro agregaci souvisejících vlastností.

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Pokud chcete namapovat předchozí tajemství na POCO, použijte funkci vazby objektového grafu rozhraní .NET Configuration API. Následující kód vytvoří vazbu na vlastní MovieSettings POCO a přistupuje k hodnotě vlastnosti ServiceApiKey:

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

Tajemství Movies:ConnectionStringMovies:ServiceApiKey jsou namapována na příslušné vlastnosti v MovieSettings.

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

    public string ServiceApiKey { get; set; }
}

Použijte nahrazování řetězců pomocí tajných údajů

Ukládání hesel ve formátu prostého textu je nezabezpečené. Nikdy neukládejte tajné údaje do konfiguračního souboru, jako je appsettings.json, který by se mohl omylem odevzdat do úložiště zdrojového kódu.

Například databáze připojovací řetězec uložená v souboru appsettings.json by neměla obsahovat heslo. Místo toho heslo uložte jako tajný klíč a zahrňte ho do připojovacího řetězce za běhu. Například:

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

<secret value> Zástupný symbol v příkladu nahraďte hodnotou hesla. Nastavte hodnotu tajemství na vlastnost SqlConnectionStringBuilder objektu Password, aby byla zahrnuta jako hodnota hesla v připojovacím řetězci.

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

Výpis tajných kódů

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets list

Objeví se následující výstup:

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

V příkladu dvojtečka (:) v názvech klíčů označuje hierarchii objektů v souboru secrets.json .

Odebrání jednoho tajného kódu

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets remove "Movies:ConnectionString"

Soubor secrets.json aplikace se upraví tak, aby odebral dvojici klíč-hodnota přidruženou ke klíči Movies:ConnectionString :

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

Příkaz dotnet user-secrets list zobrazí následující zprávu:

Movies:ServiceApiKey = 12345

Odebrání všech tajných kódů

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets clear

Ze souboru secrets.json se odstraní všechny tajné kódy uživatelů aplikace:

{}

Spuštěním dotnet user-secrets list příkazu se zobrazí následující zpráva:

No secrets configured for this application.

Správa tajných kódů uživatelů pomocí sady Visual Studio

Pokud chcete spravovat tajné kódy uživatelů v Visual Studio, klikněte pravým tlačítkem na projekt v Průzkumník řešení a vyberte Manage User Secrets:

Screenshot ukazuje, jak vybrat možnost Spravovat tajné kódy uživatelů v Visual Studio.

Migrace tajných kódů uživatelů z architektury ASP.NET na ASP.NET Core

Uložené tajné kódy uživatelů můžete migrovat z rozhraní ASP.NET Framework do ASP.NET Core. Další informace najdete v tématu GitHub problém s dotnet/aspnetcore.docs #27611 - Dokumentace tajných kódů uživatelů nezmiňuje nekompatibilitu s AssemblyInfo.cs.

Práce s tajnými kódy uživatelů v jiných než webových aplikacích

Projekty, které Microsoft.NET.Sdk.Web cíli, automaticky zahrnují podporu uživatelských tajemství. Pro projekty, které cílí Microsoft.NET.Sdk, jako jsou konzolové aplikace, explicitně nainstalujte balíčky NuGet pro rozšíření konfigurace a uživatelská tajemství.

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

Po instalaci balíčků inicializujete projekt a nastavíte tajné kódy stejným způsobem jako u webové aplikace. Následující příklad ukazuje konzolovou aplikaci, která načte hodnotu sady tajných kódů pomocí AppSecret klíče:

using Microsoft.Extensions.Configuration;

namespace ConsoleApp;

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

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

Autor: Rick Anderson, Kirk Larkin, Daniel Roth a Scott Addie

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Tento článek vysvětluje, jak spravovat citlivá data pro aplikaci ASP.NET Core na vývojovém počítači. Nikdy neukládejte hesla ani jiná citlivá data ve zdrojovém kódu nebo konfiguračních souborech. Produkční tajné kódy by se neměly používat pro vývoj ani testování. Tajné kódy by se neměly nasazovat s aplikací. Produkční tajné kódy by měly být přístupné prostřednictvím kontrolovaných prostředků, jako je Azure Key Vault. Testovací a produkční tajné kódy Azure je možné ukládat a chránit pomocí poskytovatele konfigurace služby Azure Key Vault.

Další informace o ověřování pro testovací a produkční prostředí najdete v tématu Zabezpečené toky ověřování.

Proměnné prostředí

Proměnné prostředí se používají k tomu, aby se zabránilo ukládání tajných kódů aplikací v kódu nebo v místních konfiguračních souborech. Proměnné prostředí převyšují hodnoty konfigurace pro všechny dříve zadané zdroje konfigurace.

Zvažte ASP.NET základní webovou aplikaci, ve které je povolené zabezpečení jednotlivých uživatelských účtů . Výchozí připojovací řetězec databáze je součástí souboru projektu appsettings.json s klíčem DefaultConnection. Výchozí připojovací řetězec je pro LocalDB, která běží v uživatelském režimu a nevyžaduje heslo. Během nasazování DefaultConnection aplikace je možné hodnotu klíče přepsat hodnotou proměnné prostředí. Proměnná prostředí může uložit kompletní připojovací řetězec s citlivými přihlašovacími údaji.

Warning

Proměnné prostředí jsou obecně uložené ve formátu prostého a nešifrovaného textu. Pokud dojde k ohrožení zabezpečení počítače nebo procesu, můžou k proměnným prostředí přistupovat nedůvěryhodné strany. Mohou být vyžadována další opatření, která brání zpřístupnění tajných kódů uživatelů.

Oddělovač dvojtečky (:) nefunguje u hierarchických klíčů proměnných prostředí na všech platformách. Například Bash nepodporuje dvojtečku (:) jako oddělovač. Všechny platformy podporují syntaxi dvojitého podtržítka (__) a automaticky ji nahradí dvojtečkam (:).

Správce tajemství

Nástroj Secret Manager ukládá citlivá data během vývoje aplikací. V tomto kontextu je část citlivých dat tajným kódem aplikace. Tajemství aplikací jsou ukládána na samostatné umístění než strom projektu. Tajné kódy aplikace jsou přidružené ke konkrétnímu projektu nebo jsou sdíleny napříč několika projekty. Tajemství aplikace nejsou ukládána do správy verzí.

Warning

Nástroj Secret Manager nezašifruje uložené tajné kódy a neměl by se považovat za důvěryhodné úložiště. Slouží pouze pro účely vývoje. Klíče a hodnoty jsou uloženy v konfiguračním souboru JSON v adresáři profilu uživatele.

Jak funguje nástroj Secret Manager

Nástroj Secret Manager skryje podrobnosti implementace, například kde a jak se hodnoty ukládají. Nástroj můžete použít bez znalosti těchto podrobností implementace. Hodnoty se ukládají do souboru JSON ve složce profilu uživatele místního počítače:

Cesta souborového systému

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

V uvedených cestách k souborům nahraďte <user_secrets_id> hodnotou UserSecretsId zadanou v souboru projektu.

Nezapisujte kód, který závisí na umístění nebo formátu dat uložených pomocí nástroje Secret Manager. Tyto podrobnosti implementace se můžou změnit. Například tajné hodnoty nejsou šifrované, ale můžou být v budoucnu.

Povolení úložiště tajných kódů

Nástroj Secret Manager pracuje s nastavením konfigurace specifického pro projekt uloženým ve vašem profilu uživatele.

V sadě .NET Core SDK 3.0.100 nebo novější obsahuje nástroj Secret Manager příkaz init. Pokud chcete používat tajné kódy uživatelů, spusťte v adresáři projektu následující příkaz:

dotnet user-secrets init

Předchozí příkaz přidá prvek UserSecretsId do PropertyGroup souboru projektu. Ve výchozím nastavení je vnitřní text UserSecretsId identifikátoru GUID. Vnitřní text je libovolný, ale je jedinečný pro projekt.

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

V sadě Visual Studio klikněte pravým tlačítkem myši na projekt v Průzkumníku řešení a v místní nabídce vyberte Spravovat tajnosti uživatele. Toto gesto přidá do souboru projektu prvek UserSecretsId, který je naplněný identifikátorem GUID.

Nastavení tajného kódu

Definujte tajný klíč aplikace, který se skládá z klíče a jeho hodnoty. Tajemství je spojeno s hodnotou projektu UserSecretsId. Například z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

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

V předchozím příkladu dvojtečka označuje, že Movies je objektový literál s vlastností ServiceApiKey.

Nástroj Secret Manager lze použít i z jiných adresářů. --project Pomocí možnosti zadejte cestu k systému souborů, ve které soubor projektu existuje. Například:

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

Zploštění struktury JSON v prostředí Visual Studio

Gesto Správa tajných kódů uživatelů sady Visual Studio otevře secrets.json soubor v textovém editoru. Nahraďte obsah secrets.json dvojicemi klíč-hodnota, které se mají uložit. Například:

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

Struktura JSON je zploštěna po úpravách prostřednictvím dotnet user-secrets remove nebo dotnet user-secrets set. Například spuštění dotnet user-secrets remove "Movies:ConnectionString" sbalí objektový literál Movies. Upravený soubor se podobá následujícímu formátu JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Nastavení více tajných kódů

Dávku tajných kódů lze nastavit tak, že do set příkazu prodáte kód JSON. V následujícím příkladu input.json se obsah souboru předá do set příkazu.

Otevřete příkazové prostředí a spusťte následující příkaz:

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

Přístup k tajnému kódu

Pokud chcete získat přístup k tajnému kódu, proveďte následující kroky:

  1. Registrace zdroje konfigurace uživatelských tajemství
  2. Čtení tajného kódu prostřednictvím konfiguračního rozhraní API

Registrace zdroje konfigurace uživatelských tajemství

Poskytovatel konfigurace uživatelských tajemství zaregistruje příslušný zdroj konfigurace v rozhraní .NET Configuration API.

Zdroj konfigurace uživatelských tajemství se automaticky přidá v režimu vývoje při volání CreateDefaultBuilder projektu. CreateDefaultBuilder volá AddUserSecrets když je EnvironmentName: Development

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

Pokud CreateDefaultBuilder není voláno, přidejte zdroj konfigurace uživatelských tajemství explicitně tím, že zavoláte AddUserSecrets v ConfigureAppConfiguration. Zavolejte AddUserSecrets pouze v případě, že aplikace běží v Development prostředí, jak je znázorněno v následujícím příkladu:

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

Čtení tajného kódu prostřednictvím konfiguračního rozhraní API

Pokud je zdroj konfigurace tajných kódů uživatele zaregistrovaný, může rozhraní .NET Configuration API číst tajné kódy. Injektáž konstruktoru lze použít k získání přístupu k rozhraní .NET Configuration API. Podívejte se na následující příklady čtení Movies:ServiceApiKey klíče:

Spouštěcí třída:

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 Model stránky stránky:

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

Další informace naleznete v tématu Konfigurace přístupu při spuštění a konfiguraci přístupu na Razor stránkách.

Mapování tajností na POCO

Mapování celého literálu objektu na POCO (jednoduchá třída .NET s vlastnostmi) je užitečné pro agregaci souvisejících vlastností.

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Pokud chcete namapovat předchozí tajemství na POCO, použijte funkci vazby objektového grafu rozhraní .NET Configuration API. Následující kód vytvoří vazbu na vlastní MovieSettings POCO a přistupuje k hodnotě vlastnosti ServiceApiKey:

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

Tajemství Movies:ConnectionStringMovies:ServiceApiKey jsou namapována na příslušné vlastnosti v MovieSettings.

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

    public string ServiceApiKey { get; set; }
}

Nahrazování řetězců tajemstvími

Ukládání hesel ve formátu prostého textu je nezabezpečené. Nikdy neukládejte tajemství do konfiguračního souboru, jako je například appsettings.json, který by mohl být omylem zahrnut do úložiště zdrojového kódu.

Například připojovací řetězec databáze uložený v appsettings.json by neměl obsahovat heslo. Místo toho heslo uložte jako tajný klíč a zahrňte ho do připojovacího řetězce za běhu. Například:

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

<secret value> Zástupný symbol v předchozím příkladu nahraďte hodnotou hesla. Nastavte hodnotu tajemství na vlastnost SqlConnectionStringBuilder objektu Password, aby byla zahrnuta jako hodnota hesla v připojovacím řetězci.

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

Výpis tajných kódů

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets list

Objeví se následující výstup:

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

V předchozím příkladu dvojtečka v názvech klíčů označuje hierarchii objektů v rámci secrets.json.

Odebrání jednoho tajného kódu

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets remove "Movies:ConnectionString"

Soubor aplikace secrets.json byl upraven tak, aby odebral pár klíč-hodnota přidružený ke klíči MoviesConnectionString :

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

dotnet user-secrets list zobrazí následující zprávu:

Movies:ServiceApiKey = 12345

Odebrání všech tajných kódů

Předpokládejme, že souborsecrets.json aplikace obsahuje následující dva tajné kódy:

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

Z adresáře, ve kterém existuje soubor projektu, spusťte následující příkaz:

dotnet user-secrets clear

Z souboru byly odstraněny secrets.json všechny tajné kódy uživatelů pro aplikaci:

{}

Při spuštění dotnet user-secrets list se zobrazí následující zpráva:

No secrets configured for this application.

Správa tajných kódů uživatelů pomocí sady Visual Studio

Pokud chcete spravovat tajné kódy uživatelů v sadě Visual Studio, klikněte pravým tlačítkem na projekt v Průzkumníku řešení a vyberte Spravovat tajné kódy uživatelů:

Visual Studio zobrazující správu tajných kódů uživatelů

Migrace tajných kódů uživatelů z architektury ASP.NET na ASP.NET Core

Podívejte se na tento problém na GitHubu.

Tajné kódy uživatelů v jiných než webových aplikacích

Projekty, které Microsoft.NET.Sdk.Web cíli, automaticky zahrnují podporu uživatelských tajemství. Pro projekty, které cílí Microsoft.NET.Sdk, jako jsou konzolové aplikace, explicitně nainstalujte balíčky NuGet pro rozšíření konfigurace a uživatelská tajemství.

Pomocí PowerShellu:

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

Pomocí rozhraní příkazového řádku .NET:

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

Po instalaci balíčků inicializujte projekt a nastavte tajné kódy stejným způsobem jako u webové aplikace. Následující příklad ukazuje konzolovou aplikaci, která načte hodnotu tajného klíče nastaveného klíčem "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"]);
    }
}

Dodatečné zdroje