Sejf przechowywanie wpisów tajnych aplikacji podczas programowania w ASP.NET Core

Przez Rick Anderson i Kirk Larkin

Wyświetl lub pobierz przykładowy kod (jak pobrać)

W tym dokumencie wyjaśniono, jak zarządzać poufnymi danymi dla aplikacji ASP.NET Core na komputerze deweloperskim. Nigdy nie przechowuj haseł ani innych poufnych danych w kodzie źródłowym. Wpisy tajne produkcyjne nie powinny być używane do programowania ani testowania. Wpisy tajne nie powinny być wdrażane z aplikacją. Zamiast tego dostęp do wpisów tajnych produkcyjnych należy uzyskać za pośrednictwem kontrolowanych środków, takich jak zmienne środowiskowe lub azure Key Vault. Wpisy tajne testowania i produkcji platformy Azure można przechowywać i chronić za pomocą dostawcy konfiguracji usługi Azure Key Vault.

Zmienne środowiskowe

Zmienne środowiskowe służą do unikania przechowywania wpisów tajnych aplikacji w kodzie lub w lokalnych plikach konfiguracji. Zmienne środowiskowe zastępują wartości konfiguracji dla wszystkich wcześniej określonych źródeł konfiguracji.

Rozważ ASP.NET Core aplikację internetową, w której włączono zabezpieczenia poszczególnych kont użytkowników. Domyślne parametry połączenia bazy danych są uwzględniane w pliku projektu appsettings.json z kluczem DefaultConnection. Domyślne parametry połączenia to LocalDB, która działa w trybie użytkownika i nie wymaga hasła. Podczas wdrażania DefaultConnection aplikacji wartość klucza można zastąpić wartością zmiennej środowiskowej. Zmienna środowiskowa może przechowywać pełne parametry połączenia z poufnymi poświadczeniami.

Ostrzeżenie

Zmienne środowiskowe są zwykle przechowywane w postaci zwykłego, niezaszyfrowanego tekstu. W przypadku naruszenia zabezpieczeń maszyny lub procesu zmienne środowiskowe mogą być dostępne przez niezaufane strony. Mogą być wymagane dodatkowe środki, aby zapobiec ujawnieniu wpisów tajnych użytkownika.

Separator : nie działa z kluczami hierarchicznymi zmiennych środowiskowych na wszystkich platformach. __, podwójne podkreślenie, to:

  • Obsługiwane przez wszystkie platformy. Na przykład separator nie jest obsługiwany przez powłokę :Bash, ale __ jest.
  • Automatycznie zastąpione przez :

Menedżer wpisów tajnych

Narzędzie Secret Manager przechowuje poufne dane podczas opracowywania projektu ASP.NET Core. W tym kontekście element poufnych danych jest wpisem tajnym aplikacji. Wpisy tajne aplikacji są przechowywane w oddzielnej lokalizacji od drzewa projektu. Wpisy tajne aplikacji są skojarzone z określonym projektem lub udostępniane w kilku projektach. Wpisy tajne aplikacji nie są ewidencjowane w kontroli źródła.

Ostrzeżenie

Narzędzie Secret Manager nie szyfruje przechowywanych wpisów tajnych i nie powinno być traktowane jako zaufany magazyn. Jest przeznaczona tylko do celów programistycznych. Klucze i wartości są przechowywane w pliku konfiguracji JSON w katalogu profilu użytkownika.

Jak działa narzędzie Secret Manager

Narzędzie Secret Manager ukrywa szczegóły implementacji, takie jak miejsce i sposób przechowywania wartości. Możesz użyć narzędzia bez znajomości tych szczegółów implementacji. Wartości są przechowywane w pliku JSON w folderze profilu użytkownika komputera lokalnego:

Ścieżka systemu plików:

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

W poprzednich ścieżkach plików zastąp <user_secrets_id>UserSecretsId wartość określoną w pliku projektu.

Nie zapisuj kodu, który zależy od lokalizacji lub formatu danych zapisanych za pomocą narzędzia Secret Manager. Te szczegóły implementacji mogą ulec zmianie. Na przykład wartości wpisów tajnych nie są szyfrowane, ale mogą być w przyszłości.

Włączanie magazynu wpisów tajnych

Narzędzie Secret Manager działa na ustawieniach konfiguracji specyficznych dla projektu przechowywanych w profilu użytkownika.

Narzędzie Secret Manager zawiera init polecenie . Aby użyć wpisów tajnych użytkownika, uruchom następujące polecenie w katalogu projektu:

dotnet user-secrets init

Poprzednie polecenie dodaje UserSecretsId element w PropertyGroup pliku projektu. Domyślnie tekst wewnętrzny elementu UserSecretsId to identyfikator GUID. Tekst wewnętrzny jest dowolny, ale jest unikatowy dla projektu.

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

W Visual Studio kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań, a następnie wybierz pozycję Zarządzaj wpisami tajnymi użytkownika z menu kontekstowego. Ten gest dodaje UserSecretsId element wypełniony identyfikatorem GUID do pliku projektu.

Ustawianie wpisu tajnego

Zdefiniuj wpis tajny aplikacji składający się z klucza i jego wartości. Wpis tajny jest skojarzony z wartością UserSecretsId projektu. Na przykład uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

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

W poprzednim przykładzie dwukropek oznacza, że Movies jest to literał obiektu z właściwością ServiceApiKey .

Narzędzie Secret Manager może być również używane z innych katalogów. --project Użyj opcji , aby podać ścieżkę systemu plików, w której istnieje plik projektu. Na przykład:

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

Spłaszczanie struktury JSON w Visual Studio

Visual Studio gest Manage User Secrets (Zarządzanie wpisami tajnymi użytkownika) otwiera secrets.json plik w edytorze tekstów. Zastąp zawartość secrets.json par klucz-wartość, które mają być przechowywane. Na przykład:

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

Struktura JSON jest spłaszczana po modyfikacjach za pośrednictwem metody dotnet user-secrets remove lub dotnet user-secrets set. Na przykład uruchomienie dotnet user-secrets remove "Movies:ConnectionString" zwija Movies literał obiektu. Zmodyfikowany plik przypomina następujący kod JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Ustawianie wielu wpisów tajnych

Partię wpisów tajnych można ustawić, potokując kod JSON do set polecenia . W poniższym przykładzie input.json zawartość pliku jest potokowana do set polecenia .

Otwórz powłokę poleceń i wykonaj następujące polecenie:

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

Uzyskiwanie dostępu do wpisu tajnego

Aby uzyskać dostęp do wpisu tajnego, wykonaj następujące kroki:

  1. Rejestrowanie źródła konfiguracji wpisów tajnych użytkownika
  2. Odczytywanie wpisu tajnego za pośrednictwem interfejsu API konfiguracji

Rejestrowanie źródła konfiguracji wpisów tajnych użytkownika

Dostawca konfiguracji wpisów tajnych użytkownika rejestruje odpowiednie źródło konfiguracji za pomocą interfejsu API konfiguracji platformy .NET.

ASP.NET Core aplikacje internetowe utworzone za pomocą polecenia dotnet new lub Visual Studio wygenerować następujący kod:

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

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

app.Run();

WebApplication.CreateBuilder inicjuje nowe wystąpienie WebApplicationBuilder klasy z wstępnie skonfigurowanymi wartościami domyślnymi. Zainicjowane WebApplicationBuilder (builder) zapewnia konfigurację domyślną i wywołania AddUserSecrets , gdy parametr EnvironmentName to Development:

Odczytywanie wpisu tajnego za pośrednictwem interfejsu API konfiguracji

Rozważmy następujące przykłady odczytywania Movies:ServiceApiKey klucza:

Plik Program.cs:

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

var app = builder.Build();

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

app.Run();

Razor Model strony stron:

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

Aby uzyskać więcej informacji, zobacz Konfiguracja w ASP.NET Core.

Mapowanie wpisów tajnych na poco

Mapowanie całego literału obiektu na obiekt POCO (prosta klasa .NET z właściwościami) jest przydatne do agregowania powiązanych właściwości.

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Aby zamapować poprzednie wpisy tajne na element POCO, użyj funkcji powiązania grafów obiektów interfejsu API konfiguracji platformy .NET. Poniższy kod wiąże się z niestandardową MovieSettings funkcją POCO i uzyskuje ServiceApiKey dostęp do wartości właściwości:

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

Wpisy Movies:ConnectionString tajne i Movies:ServiceApiKey są mapowane na odpowiednie właściwości w pliku MovieSettings:

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

    public string ServiceApiKey { get; set; }
}

Zastępowanie ciągów wpisami tajnymi

Przechowywanie haseł w postaci zwykłego tekstu jest niezabezpieczone. Na przykład parametry połączenia bazy danych przechowywane w appsettings.json programie mogą zawierać hasło dla określonego użytkownika:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

Bardziej bezpieczne podejście polega na przechowywaniu hasła jako wpisu tajnego. Na przykład:

dotnet user-secrets set "DbPassword" "pass123"

Password Usuń parę klucz-wartość z parametrów połączenia w pliku appsettings.json. Na przykład:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

Wartość wpisu tajnego SqlConnectionStringBuilder można ustawić we właściwości obiektu Password w celu ukończenia parametrów połączenia:

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

Wyświetlanie listy wpisów tajnych

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets list

Wyświetlane są następujące dane wyjściowe:

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

W poprzednim przykładzie dwukropek w nazwach kluczy określa hierarchię obiektów w obiekcie secrets.json.

Usuwanie pojedynczego wpisu tajnego

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets remove "Movies:ConnectionString"

Plik aplikacji secrets.json został zmodyfikowany w celu usunięcia pary klucz-wartość skojarzonej z kluczem MoviesConnectionString :

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

dotnet user-secrets list wyświetla następujący komunikat:

Movies:ServiceApiKey = 12345

Usuwanie wszystkich wpisów tajnych

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets clear

Wszystkie wpisy tajne użytkownika dla aplikacji zostały usunięte z secrets.json pliku:

{}

Uruchomienie dotnet user-secrets list powoduje wyświetlenie następującego komunikatu:

No secrets configured for this application.

Zarządzanie wpisami tajnymi użytkownika za pomocą Visual Studio

Aby zarządzać wpisami tajnymi użytkownika w Visual Studio, kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz pozycję Zarządzaj wpisami tajnymi użytkownika:

Visual Studio showing Manage User Secrets

Dodatkowe zasoby

Przez Rick Anderson, Kirk Larkin, Daniel Roth i Scott Addie

Wyświetl lub pobierz przykładowy kod (jak pobrać)

W tym dokumencie wyjaśniono, jak zarządzać poufnymi danymi dla aplikacji ASP.NET Core na komputerze deweloperskim. Nigdy nie przechowuj haseł ani innych poufnych danych w kodzie źródłowym. Wpisy tajne produkcyjne nie powinny być używane do programowania ani testowania. Wpisy tajne nie powinny być wdrażane z aplikacją. Zamiast tego dostęp do wpisów tajnych produkcyjnych należy uzyskać za pośrednictwem kontrolowanych środków, takich jak zmienne środowiskowe lub azure Key Vault. Wpisy tajne testowania i produkcji platformy Azure można przechowywać i chronić za pomocą dostawcy konfiguracji usługi Azure Key Vault.

Zmienne środowiskowe

Zmienne środowiskowe służą do unikania przechowywania wpisów tajnych aplikacji w kodzie lub w lokalnych plikach konfiguracji. Zmienne środowiskowe zastępują wartości konfiguracji dla wszystkich wcześniej określonych źródeł konfiguracji.

Rozważ ASP.NET Core aplikację internetową, w której włączono zabezpieczenia poszczególnych kont użytkowników. Domyślne parametry połączenia bazy danych są uwzględniane w pliku projektu appsettings.json z kluczem DefaultConnection. Domyślne parametry połączenia to LocalDB, która działa w trybie użytkownika i nie wymaga hasła. Podczas wdrażania DefaultConnection aplikacji wartość klucza można zastąpić wartością zmiennej środowiskowej. Zmienna środowiskowa może przechowywać pełne parametry połączenia z poufnymi poświadczeniami.

Ostrzeżenie

Zmienne środowiskowe są zwykle przechowywane w postaci zwykłego, niezaszyfrowanego tekstu. W przypadku naruszenia zabezpieczeń maszyny lub procesu zmienne środowiskowe mogą być dostępne przez niezaufane strony. Mogą być wymagane dodatkowe środki, aby zapobiec ujawnieniu wpisów tajnych użytkownika.

Separator : nie działa z kluczami hierarchicznymi zmiennych środowiskowych na wszystkich platformach. __, podwójne podkreślenie, to:

  • Obsługiwane przez wszystkie platformy. Na przykład separator nie jest obsługiwany przez powłokę :Bash, ale __ jest.
  • Automatycznie zastąpione przez :

Menedżer wpisów tajnych

Narzędzie Secret Manager przechowuje poufne dane podczas opracowywania projektu ASP.NET Core. W tym kontekście element poufnych danych jest wpisem tajnym aplikacji. Wpisy tajne aplikacji są przechowywane w oddzielnej lokalizacji od drzewa projektu. Wpisy tajne aplikacji są skojarzone z określonym projektem lub udostępniane w kilku projektach. Wpisy tajne aplikacji nie są ewidencjowane w kontroli źródła.

Ostrzeżenie

Narzędzie Secret Manager nie szyfruje przechowywanych wpisów tajnych i nie powinno być traktowane jako zaufany magazyn. Jest przeznaczona tylko do celów programistycznych. Klucze i wartości są przechowywane w pliku konfiguracji JSON w katalogu profilu użytkownika.

Jak działa narzędzie Secret Manager

Narzędzie Secret Manager ukrywa szczegóły implementacji, takie jak miejsce i sposób przechowywania wartości. Możesz użyć narzędzia bez znajomości tych szczegółów implementacji. Wartości są przechowywane w pliku JSON w folderze profilu użytkownika komputera lokalnego:

Ścieżka systemu plików:

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

W poprzednich ścieżkach plików zastąp <user_secrets_id>UserSecretsId wartość określoną w pliku projektu.

Nie zapisuj kodu, który zależy od lokalizacji lub formatu danych zapisanych za pomocą narzędzia Secret Manager. Te szczegóły implementacji mogą ulec zmianie. Na przykład wartości wpisów tajnych nie są szyfrowane, ale mogą być w przyszłości.

Włączanie magazynu wpisów tajnych

Narzędzie Secret Manager działa na ustawieniach konfiguracji specyficznych dla projektu przechowywanych w profilu użytkownika.

Narzędzie Secret Manager zawiera init polecenie w zestawie .NET Core SDK 3.0.100 lub nowszym. Aby użyć wpisów tajnych użytkownika, uruchom następujące polecenie w katalogu projektu:

dotnet user-secrets init

Poprzednie polecenie dodaje UserSecretsId element w PropertyGroup pliku projektu. Domyślnie tekst wewnętrzny elementu UserSecretsId to identyfikator GUID. Tekst wewnętrzny jest dowolny, ale jest unikatowy dla projektu.

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

W Visual Studio kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań, a następnie wybierz pozycję Zarządzaj wpisami tajnymi użytkownika z menu kontekstowego. Ten gest dodaje UserSecretsId element wypełniony identyfikatorem GUID do pliku projektu.

Ustawianie wpisu tajnego

Zdefiniuj wpis tajny aplikacji składający się z klucza i jego wartości. Wpis tajny jest skojarzony z wartością UserSecretsId projektu. Na przykład uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

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

W poprzednim przykładzie dwukropek oznacza, że Movies jest to literał obiektu z właściwością ServiceApiKey .

Narzędzie Secret Manager może być również używane z innych katalogów. --project Użyj opcji , aby podać ścieżkę systemu plików, w której istnieje plik projektu. Na przykład:

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

Spłaszczanie struktury JSON w Visual Studio

Visual Studio gest Manage User Secrets (Zarządzanie wpisami tajnymi użytkownika) otwiera secrets.json plik w edytorze tekstów. Zastąp zawartość secrets.json par klucz-wartość, które mają być przechowywane. Na przykład:

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

Struktura JSON jest spłaszczana po modyfikacjach za pośrednictwem metody dotnet user-secrets remove lub dotnet user-secrets set. Na przykład uruchomienie dotnet user-secrets remove "Movies:ConnectionString" zwija Movies literał obiektu. Zmodyfikowany plik przypomina następujący kod JSON:

{
  "Movies:ServiceApiKey": "12345"
}

Ustawianie wielu wpisów tajnych

Partię wpisów tajnych można ustawić, potokując kod JSON do set polecenia . W poniższym przykładzie input.json zawartość pliku jest potokowana do set polecenia .

Otwórz powłokę poleceń i wykonaj następujące polecenie:

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

Uzyskiwanie dostępu do wpisu tajnego

Aby uzyskać dostęp do wpisu tajnego, wykonaj następujące kroki:

  1. Rejestrowanie źródła konfiguracji wpisów tajnych użytkownika
  2. Odczytywanie wpisu tajnego za pośrednictwem interfejsu API konfiguracji

Rejestrowanie źródła konfiguracji wpisów tajnych użytkownika

Dostawca konfiguracji wpisów tajnych użytkownika rejestruje odpowiednie źródło konfiguracji za pomocą interfejsu API konfiguracji platformy .NET.

Źródło konfiguracji wpisów tajnych użytkownika jest automatycznie dodawane w trybie programowania, gdy projekt wywołuje CreateDefaultBuildermetodę . CreateDefaultBuilder wywołuje metodę AddUserSecrets , gdy element EnvironmentName to Development:

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

Gdy CreateDefaultBuilder nie jest wywoływana, dodaj źródło konfiguracji wpisów tajnych użytkownika jawnie, wywołując polecenie AddUserSecrets w pliku ConfigureAppConfiguration. Wywołaj wywołanie AddUserSecrets tylko wtedy, gdy aplikacja działa w środowisku deweloperów, jak pokazano w poniższym przykładzie:

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

Odczytywanie wpisu tajnego za pośrednictwem interfejsu API konfiguracji

Jeśli źródło konfiguracji wpisów tajnych użytkownika jest zarejestrowane, interfejs API konfiguracji platformy .NET może odczytywać wpisy tajne. Iniekcja konstruktora może służyć do uzyskiwania dostępu do interfejsu API konfiguracji platformy .NET. Rozważmy następujące przykłady odczytywania Movies:ServiceApiKey klucza:

Klasa uruchamiania:

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 strony stron:

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

Aby uzyskać więcej informacji, zobacz Konfiguracja dostępu w konfiguracji uruchamiania i dostępu na Razor stronach.

Mapowanie wpisów tajnych na poco

Mapowanie całego literału obiektu na obiekt POCO (prosta klasa .NET z właściwościami) jest przydatne do agregowania powiązanych właściwości.

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Aby zamapować poprzednie wpisy tajne na element POCO, użyj funkcji powiązania grafów obiektów interfejsu API konfiguracji platformy .NET. Poniższy kod wiąże się z niestandardową MovieSettings funkcją POCO i uzyskuje ServiceApiKey dostęp do wartości właściwości:

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

Wpisy Movies:ConnectionString tajne i Movies:ServiceApiKey są mapowane na odpowiednie właściwości w pliku MovieSettings:

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

    public string ServiceApiKey { get; set; }
}

Zastępowanie ciągów wpisami tajnymi

Przechowywanie haseł w postaci zwykłego tekstu jest niezabezpieczone. Na przykład parametry połączenia bazy danych przechowywane w appsettings.json programie mogą zawierać hasło dla określonego użytkownika:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

Bardziej bezpieczne podejście polega na przechowywaniu hasła jako wpisu tajnego. Na przykład:

dotnet user-secrets set "DbPassword" "pass123"

Password Usuń parę klucz-wartość z parametrów połączenia w pliku appsettings.json. Na przykład:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

Wartość wpisu tajnego SqlConnectionStringBuilder można ustawić we właściwości obiektu Password w celu ukończenia parametrów połączenia:

public class Startup
{
    private string _connection = null;

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        var builder = new SqlConnectionStringBuilder(
            Configuration.GetConnectionString("Movies"));
        builder.Password = Configuration["DbPassword"];
        _connection = builder.ConnectionString;

        // code omitted for brevity
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync($"DB Connection: {_connection}");
        });
    }
}

Wyświetlanie listy wpisów tajnych

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets list

Wyświetlane są następujące dane wyjściowe:

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

W poprzednim przykładzie dwukropek w nazwach kluczy określa hierarchię obiektów w obiekcie secrets.json.

Usuwanie pojedynczego wpisu tajnego

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets remove "Movies:ConnectionString"

Plik aplikacji secrets.json został zmodyfikowany w celu usunięcia pary klucz-wartość skojarzonej z kluczem MoviesConnectionString :

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

dotnet user-secrets list wyświetla następujący komunikat:

Movies:ServiceApiKey = 12345

Usuwanie wszystkich wpisów tajnych

Załóżmy, że plik aplikacji secrets.json zawiera następujące dwa wpisy tajne:

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

Uruchom następujące polecenie z katalogu, w którym istnieje plik projektu:

dotnet user-secrets clear

Wszystkie wpisy tajne użytkownika dla aplikacji zostały usunięte z secrets.json pliku:

{}

Uruchomienie dotnet user-secrets list powoduje wyświetlenie następującego komunikatu:

No secrets configured for this application.

Zarządzanie wpisami tajnymi użytkownika za pomocą Visual Studio

Aby zarządzać wpisami tajnymi użytkownika w Visual Studio, kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz pozycję Zarządzaj wpisami tajnymi użytkownika:

Visual Studio showing Manage User Secrets

Dodatkowe zasoby