Dostawcy magazynu kluczy w usłudze ASP.NET Core

System ochrony danych domyślnie wykorzystuje mechanizm odnajdywania, aby określić, gdzie powinny być utrwalane klucze kryptograficzne. Deweloper może zastąpić domyślny mechanizm odnajdywania i ręcznie określić lokalizację.

Ostrzeżenie

Jeśli określisz jawną lokalizację trwałości klucza, system ochrony danych wyrejestruje domyślne szyfrowanie kluczy magazynowanych, więc klucze nie są już szyfrowane w spoczynku. Zaleca się dodatkowo określenie jawnego mechanizmu szyfrowania kluczy dla wdrożeń produkcyjnych.

System plików

Aby skonfigurować repozytorium kluczy opartych na systemie plików, wywołaj procedurę PersistKeysToFileSystem konfiguracji, jak pokazano poniżej. Podaj wskazanie DirectoryInfo repozytorium, w którym powinny być przechowywane klucze:

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

Element DirectoryInfo może wskazywać katalog na komputerze lokalnym lub wskazywać folder w udziale sieciowym. Jeśli wskazuje katalog na komputerze lokalnym (i scenariusz jest taki, że tylko aplikacje na komputerze lokalnym wymagają dostępu do korzystania z tego repozytorium), rozważ użycie interfejsu DPAPI systemu Windows (w systemie Windows) do szyfrowania kluczy magazynowanych. W przeciwnym razie rozważ użycie certyfikatu X.509 do szyfrowania kluczy magazynowanych.

Azure Storage

Pakiet Azure.Extensions.AspNetCore.DataProtection.Blobs umożliwia przechowywanie kluczy ochrony danych w usłudze Azure Blob Storage. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać zabezpieczenia uwierzytelniania cookielub CSRF na wielu serwerach.

Aby skonfigurować dostawcę usługi Azure Blob Storage, wywołaj jedno z PersistKeysToAzureBlobStorage przeciążeń.

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

Jeśli aplikacja internetowa jest uruchomiona jako usługa platformy Azure, parametry połączenia można użyć do uwierzytelniania w usłudze Azure Storage przy użyciu usługi 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);

Uwaga

Parametry połączenia konta magazynu można znaleźć w witrynie Azure Portal w sekcji "Klucze dostępu" lub uruchamiając następujące polecenie interfejsu wiersza polecenia:

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

Redis

Pakiet Microsoft.AspNetCore.DataProtection.StackExchangeRedis umożliwia przechowywanie kluczy ochrony danych w pamięci podręcznej Redis. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać zabezpieczenia uwierzytelniania cookielub CSRF na wielu serwerach.

Pakiet Microsoft.AspNetCore.DataProtection.Redis umożliwia przechowywanie kluczy ochrony danych w pamięci podręcznej Redis. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać zabezpieczenia uwierzytelniania cookielub CSRF na wielu serwerach.

Aby skonfigurować usługę Redis, wywołaj jedno z PersistKeysToStackExchangeRedis przeciążeń:

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

Aby skonfigurować usługę Redis, wywołaj jedno z PersistKeysToRedis przeciążeń:

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

Aby uzyskać więcej informacji, zobacz następujące tematy:

Rejestr

Dotyczy tylko wdrożeń systemu Windows.

Czasami aplikacja może nie mieć dostępu do zapisu w systemie plików. Rozważmy scenariusz, w którym aplikacja jest uruchomiona jako konto usługi wirtualnej (na przykład tożsamość puli aplikacji w3wp.exe). W takich przypadkach administrator może aprowizować klucz rejestru dostępny dla tożsamości konta usługi. Wywołaj metodę PersistKeysToRegistry rozszerzenia, jak pokazano poniżej. RegistryKey Podaj wskazanie lokalizacji, w której powinny być przechowywane klucze kryptograficzne:

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

Ważne

Zalecamy używanie interfejsu DPAPI systemu Windows do szyfrowania kluczy magazynowanych.

Entity Framework Core

Pakiet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore udostępnia mechanizm przechowywania kluczy ochrony danych w bazie danych przy użyciu programu Entity Framework Core. Pakiet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet należy dodać do pliku projektu, ale nie jest częścią Microsoft.AspNetCore.App metapakiet.

Za pomocą tego pakietu klucze mogą być współużytkowane przez wiele wystąpień aplikacji internetowej.

Aby skonfigurować dostawcę EF Core , wywołaj metodę 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);
}

Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.

Parametr ogólny , TContextmusi dziedziczyć z DbContext i implementować 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; }
    }
}

Utwórz tabelę DataProtectionKeys .

Wykonaj następujące polecenia w oknie Menedżer pakietów Console (PMC):

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

MyKeysContextDbContext jest zdefiniowany w poprzednim przykładzie kodu. Jeśli używasz elementu DbContext o innej nazwie, zastąp nazwę nazwą MyKeysContextDbContext .

Klasa DataProtectionKeys /jednostka przyjmuje strukturę pokazaną w poniższej tabeli.

Właściwość/pole Typ CLR Typ SQL
Id int int, PK, IDENTITY(1,1), nie null
FriendlyName string nvarchar(MAX)Null
Xml string nvarchar(MAX)Null

Niestandardowe repozytorium kluczy

Jeśli mechanizmy wbudowane nie są odpowiednie, deweloper może określić własny mechanizm trwałości klucza, udostępniając niestandardowy IXmlRepositoryelement .