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

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

Upozornění

Pokud zadáte explicitní umístění trvalosti klíčů, systém ochrany dat zruší registraci výchozího šifrování klíče v mechanismu REST, takže klíče už nebudou zašifrované v klidovém stavu. Pro produkční nasazení doporučujeme zadat také explicitní šifrovací mechanismus klíčů .

Systém souborů

Chcete-li nakonfigurovat úložiště klíčů založené na systému souborů, zavolejte konfigurační rutinu PersistKeysToFileSystem , jak je znázorněno níže. Zadejte příkaz DirectoryInfo ukazující na úložiště, kde se mají ukládat klíče:

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

DirectoryInfoMůže odkazovat na adresář v místním počítači nebo může ukazovat na složku ve sdílené síťové složce. pokud odkazujete na adresář v místním počítači (a scénář je, že pouze aplikace na místním počítači vyžadují přístup k používání tohoto úložiště), zvažte použití Windows DPAPI (on Windows) k šifrování neaktivních klíčů. V opačném případě zvažte použití certifikátu X. 509 k šifrování neaktivních klíčů.

Azure Storage

Balíček Azure. Extensions. AspNetCore. DataProtection. BLOBs umožňuje ukládat klíče ochrany dat v Azure Blob Storage. Klíče lze sdílet mezi několika instancemi webové aplikace. Aplikace můžou sdílet ověřování cookie s nebo CSRF ochranu napříč několika servery.

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

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, je možné k ověření v Azure Storage pomocí Azure. Storage použít připojovací řetězec. Objekty blob.

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

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

services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(container, "keys.xml");

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 CLI:

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

Redis

Balíček Microsoft. AspNetCore. DataProtection. StackExchangeRedis umožňuje ukládat klíče ochrany dat do mezipaměti Redis. Klíče lze sdílet mezi několika instancemi webové aplikace. Aplikace můžou sdílet ověřování cookie s nebo CSRF ochranu napříč několika servery.

Balíček Microsoft. AspNetCore. DataProtection. Redis umožňuje ukládat klíče ochrany dat do mezipaměti Redis. Klíče lze sdílet mezi několika instancemi webové aplikace. Aplikace můžou sdílet ověřování cookie s nebo CSRF ochranu napříč několika servery.

Pro konfiguraci v Redis zavolejte jedno z přetížení PersistKeysToStackExchangeRedis :

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

Pro konfiguraci v Redis zavolejte jedno z přetížení PersistKeysToRedis :

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

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

Registr

vztahuje se pouze na nasazení Windows.

Někdy může aplikace mít k systému souborů přístup pro zápis. Vezměte v úvahu 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ý pro identitu účtu služby. Zavolejte metodu rozšíření PersistKeysToRegistry , jak je znázorněno níže. Zadejte RegistryKey ukazující na místo, kde 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 klíčů doporučujeme použít 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. Microsoft.AspNetCore.DataProtection.EntityFrameworkCorebalíček NuGet musí být přidán do souboru projektu, není součástí metapackageu Microsoft.AspNetCore.App.

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

Chcete-li nakonfigurovat poskytovatele EF Core, zavolejte metodu <TContext> 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ž angličtiny, dejte nám vědět v tomto problému diskuze na GitHubu.

Obecný parametr, TContext , musí 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; }
    }
}

Vytvořte DataProtectionKeys 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

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

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

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

Vlastní úložiště klíčů

Pokud nejsou mechanismy v krabici vhodné, může vývojář určit vlastní mechanismus trvalosti klíčů tím, že poskytuje vlastní IXmlRepository.