Poskytovatelé úložiště klíčů v ASP.NET Core

Systém ochrany dat ve výchozím nastavení využívá mechanismus zjišťování, který určuje, kde mají být kryptografické klíče trvalé. Vývojář může přepsat výchozí mechanismus zjišťování a ručně zadat umístění.

Upozorňující

Pokud zadáte explicitní umístění trvalosti klíče, systém ochrany dat dereguje výchozí mechanismus šifrování neaktivních uložených klíčů, takže klíče se už nezašifrují v klidovém stavu. Dále doporučujeme zadat explicitní šifrovací mechanismus klíče pro produkční nasazení.

Systém souborů

Pokud chcete nakonfigurovat úložiště klíčů založeného na systému souborů, zavolejte rutinu PersistKeysToFileSystem konfigurace, jak je znázorněno níže. DirectoryInfo Zadejte odkaz na úložiště, kde by se měly ukládat klíče:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}

Může DirectoryInfo odkazovat na adresář na místním počítači nebo může odkazovat na složku ve sdílené síťové složce. Pokud odkazuje na adresář na místním počítači (a ve scénáři je to, že k použití tohoto úložiště vyžadují přístup jenom aplikace na místním počítači), zvažte použití rozhraní Windows DPAPI (ve Windows) k šifrování neaktivních uložených klíčů. Jinak zvažte použití certifikátu X.509 k šifrování neaktivních uložených klíčů.

Azure Storage

Balíček Azure.Extensions.AspNetCore.DataProtection.Blobs umožňuje ukládání klíčů ochrany dat ve službě Azure Blob Storage. Klíče je možné sdílet napříč několika instancemi webové aplikace. Aplikace můžou sdílet ochranu ověřování cookies nebo CSRF na více serverech.

Pokud chcete nakonfigurovat poskytovatele služby Azure Blob Storage, zavolejte jedno z PersistKeysToAzureBlobStorage přetížení.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}

Pokud je webová aplikace spuštěná jako služba Azure, připojovací řetězec je možné použít k ověření ve službě Azure Storage pomocí Azure.Storage.Blobs.

string connectionString = "<connection_string>";
string containerName = "my-key-container";
string blobName = "keys.xml";
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);

// optional - provision the container automatically
await container.CreateIfNotExistsAsync();

BlobClient blobClient = container.GetBlobClient(blobName);

services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(blobClient);

Poznámka

Připojovací řetězec k vašemu účtu úložiště najdete na webu Azure Portal v části Přístupové klíče nebo spuštěním následujícího příkazu rozhraní příkazového řádku:

az storage account show-connection-string --name <account_name> --resource-group <resource_group>

Redis

Balíček Microsoft.AspNetCore.DataProtection.StackExchangeRedis umožňuje ukládání klíčů ochrany dat v mezipaměti Redis. Klíče je možné sdílet napříč několika instancemi webové aplikace. Aplikace můžou sdílet ochranu ověřování cookies nebo CSRF na více serverech.

Balíček Microsoft.AspNetCore.DataProtection.Redis umožňuje ukládání klíčů ochrany dat do mezipaměti Redis. Klíče je možné sdílet napříč několika instancemi webové aplikace. Aplikace můžou sdílet ochranu ověřování cookies nebo CSRF na více serverech.

Pokud chcete nakonfigurovat v Redisu, zavolejte jedno z PersistKeysToStackExchangeRedis přetížení:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}

Pokud chcete nakonfigurovat v Redisu, zavolejte jedno z PersistKeysToRedis přetížení:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToRedis(redis, "DataProtection-Keys");
}

Další informace naleznete v následujících tématech:

Registr

Platí jenom pro nasazení systému Windows.

Aplikace někdy nemusí mít přístup k zápisu do systému souborů. Představte si scénář, ve kterém je aplikace spuštěná jako účet virtuální služby (například identita fondu aplikací w3wp.exe). V těchto případech může správce zřídit klíč registru, který je přístupný identitou účtu služby. Volejte metodu PersistKeysToRegistry rozšíření, jak je znázorněno níže. RegistryKey Zadejte odkaz na umístění, kam se mají ukládat kryptografické klíče:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}

Důležité

K šifrování neaktivních uložených klíčů doporučujeme použít rozhraní WINDOWS DPAPI .

Entity Framework Core

Balíček Microsoft.AspNetCore.DataProtection.EntityFrameworkCore poskytuje mechanismus pro ukládání klíčů ochrany dat do databáze pomocí Entity Framework Core. Balíček Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet musí být přidán do souboru projektu, není součástí Microsoft.AspNetCore.App metapackage.

S tímto balíčkem je možné klíče sdílet napříč několika instancemi webové aplikace.

Pokud chcete zprostředkovatele nakonfigurovat EF Core , zavolejte metodu PersistKeysToDbContext :

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    // Add a DbContext to store your Database Keys
    services.AddDbContext<MyKeysContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("MyKeysConnection")));

    // using Microsoft.AspNetCore.DataProtection;
    services.AddDataProtection()
        .PersistKeysToDbContext<MyKeysContext>();

    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

Obecný parametr , TContextmusí dědit z DbContext a implementovat IDataProtectionKeyContext:

using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;

namespace WebApp1
{
    class MyKeysContext : DbContext, IDataProtectionKeyContext
    {
        // A recommended constructor overload when using EF Core 
        // with dependency injection.
        public MyKeysContext(DbContextOptions<MyKeysContext> options) 
            : base(options) { }

        // This maps to the table that stores keys.
        public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
    }
}

DataProtectionKeys Vytvořte tabulku.

V okně konzoly Správce balíčků (PMC) spusťte následující příkazy:

Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext

MyKeysContextDbContext je definován v předchozí ukázce kódu. Pokud používáte jiný DbContext název, nahraďte své DbContext jméno .MyKeysContext

Třída DataProtectionKeys nebo entita přijímá strukturu zobrazenou v následující tabulce.

Vlastnost/pole Typ CLR Typ SQL
Id int int, PK, IDENTITY(1,1), not null
FriendlyName string nvarchar(MAX)Null
Xml string nvarchar(MAX)Null

Úložiště vlastních klíčů

Pokud nejsou mechanismy in-box vhodné, vývojář může zadat vlastní mechanismus trvalosti klíče poskytnutím vlastního IXmlRepository.