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í šifrování klíče v rest mechanismu, takže klíče už nejsou šifrované na restadrese . 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 přístup k tomuto úložišti vyžadují jenom aplikace na místním počítači), zvažte použití rozhraní Windows DPAPI (ve Windows) k šifrování klíčů na adrese rest. Jinak zvažte použití certifikátu X.509 k šifrování klíčů na adrese rest.

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 ověřovací soubory cookie nebo ochranu 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.

Upozorňující

Tento článek ukazuje použití připojovací řetězec. U místní databáze nemusí být uživatel ověřený, ale v produkčním prostředí připojovací řetězec někdy obsahují heslo k ověření. Přihlašovací údaje vlastníka prostředku (ROPC) jsou bezpečnostní riziko, kterému byste se měli vyhnout v produkčních databázích. Produkční aplikace by měly používat nejbezpečnější dostupný tok ověřování. Další informace o ověřování pro aplikace nasazené do testovacího nebo produkčního prostředí najdete v tématu Zabezpečené toky ověřování.

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 ověřovací soubory cookie nebo ochranu 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 ověřovací soubory cookie nebo ochranu 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 fond aplikací identityw3wp.exe). V těchto případech může správce zřídit klíč registru, který je přístupný účtem identitysluž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í klíčů na adrese rest.

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)nula
Xml string nvarchar(MAX)nula

Ú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.