Schlüsselspeicher Anbieter in ASP.net CoreKey storage providers in ASP.NET Core

Das Datenschutzsystem setzt standardmäßig einen Ermittlungs Mechanismus ein , um zu bestimmen, wo Kryptografieschlüssel persistent gespeichert werden sollen.The data protection system employs a discovery mechanism by default to determine where cryptographic keys should be persisted. Der Entwickler kann den Standard Ermittlungs Mechanismus überschreiben und den Speicherort manuell angeben.The developer can override the default discovery mechanism and manually specify the location.

Warnung

Wenn Sie einen expliziten Speicherort für die Schlüssel Persistenz angeben, hebt das Datenschutzsystem die Standardverschlüsselung im Ruhezustand auf, sodass Schlüssel im Ruhezustand nicht mehr verschlüsselt werden.If you specify an explicit key persistence location, the data protection system deregisters the default key encryption at rest mechanism, so keys are no longer encrypted at rest. Es wird empfohlen, zusätzlich einen expliziten Schlüssel Verschlüsselungsmechanismus für Produktions Bereitstellungen anzugeben.It's recommended that you additionally specify an explicit key encryption mechanism for production deployments.

DateisystemFile system

Um ein Dateisystem basiertes schlüsselrepository zu konfigurieren, müssen Sie die persistkeystofile System-Konfigurations Routine aufrufen, wie unten gezeigt.To configure a file system-based key repository, call the PersistKeysToFileSystem configuration routine as shown below. Geben Sie einen DirectoryInfo -Verweis auf das Repository an, in dem die Schlüssel gespeichert werden sollen:Provide a DirectoryInfo pointing to the repository where keys should be stored:

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

DirectoryInfoKann auf ein Verzeichnis auf dem lokalen Computer zeigen, oder es kann auf einen Ordner auf einer Netzwerkfreigabe verweisen.The DirectoryInfo can point to a directory on the local machine, or it can point to a folder on a network share. Wenn Sie auf ein Verzeichnis auf dem lokalen Computer verweisen (und das Szenario darin besteht, dass nur apps auf dem lokalen Computer Zugriff benötigen, um dieses Repository zu verwenden), können Sie die Verwendung von Windows DPAPI (unter Windows) zum Verschlüsseln der Schlüssel im Ruhezustand in Erwägung gezogen.If pointing to a directory on the local machine (and the scenario is that only apps on the local machine require access to use this repository), consider using Windows DPAPI (on Windows) to encrypt the keys at rest. Andernfalls sollten Sie die Verwendung eines X. 509-Zertifikats zum Verschlüsseln der Schlüssel im Ruhezustand in Erwägung gezogen.Otherwise, consider using an X.509 certificate to encrypt keys at rest.

Azure StorageAzure Storage

Das Paket Microsoft. aspnetcore. dataprotection. azurestorage ermöglicht die Speicherung von Datenschutz Schlüsseln in Azure BLOB Storage.The Microsoft.AspNetCore.DataProtection.AzureStorage package allows storing data protection keys in Azure Blob Storage. Schlüssel können für mehrere Instanzen einer Web-App freigegeben werden.Keys can be shared across several instances of a web app. Apps können Authentifizierungs- cookie oder CSRF-Schutz auf mehreren Servern freigeben.Apps can share authentication cookies or CSRF protection across multiple servers.

Zum Konfigurieren des Azure BLOB Storage Anbieters müssen Sie eine der persistkeystoazureblobstorage -über Ladungen abrufen.To configure the Azure Blob Storage provider, call one of the PersistKeysToAzureBlobStorage overloads.

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

Wenn die Web-App als Azure-Dienst ausgeführt wird, können Authentifizierungs Token automatisch mithilfe von Microsoft. Azure. Services. appauthenticationerstellt werden.If the web app is running as an Azure service, authentication tokens can be automatically created using Microsoft.Azure.Services.AppAuthentication.

var tokenProvider = new AzureServiceTokenProvider();
var token = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
var credentials = new StorageCredentials(new TokenCredential(token));
var storageAccount = new CloudStorageAccount(credentials, "mystorageaccount", "core.windows.net", useHttps: true);
var client = storageAccount.CreateCloudBlobClient();
var container = client.GetContainerReference("my-key-container");

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

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

Weitere Informationen zum Konfigurieren der Dienst-zu-Dienst-Authentifizierung finden Sie unter.See more details about configuring service-to-service authentication.

RedisRedis

Das Microsoft. aspnetcore. dataprotection. stackexchangeredis -Paket ermöglicht das Speichern von Datenschutz Schlüsseln in einem redis-Cache.The Microsoft.AspNetCore.DataProtection.StackExchangeRedis package allows storing data protection keys in a Redis cache. Schlüssel können für mehrere Instanzen einer Web-App freigegeben werden.Keys can be shared across several instances of a web app. Apps können Authentifizierungs- cookie oder CSRF-Schutz auf mehreren Servern freigeben.Apps can share authentication cookies or CSRF protection across multiple servers.

Das Microsoft. aspnetcore. dataprotection. redis -Paket ermöglicht das Speichern von Datenschutz Schlüsseln in einem redis-Cache.The Microsoft.AspNetCore.DataProtection.Redis package allows storing data protection keys in a Redis cache. Schlüssel können für mehrere Instanzen einer Web-App freigegeben werden.Keys can be shared across several instances of a web app. Apps können Authentifizierungs- cookie oder CSRF-Schutz auf mehreren Servern freigeben.Apps can share authentication cookies or CSRF protection across multiple servers.

Rufen Sie zum Konfigurieren von redis eine der persistkeystostackexchangeredis -über Ladungen auf:To configure on Redis, call one of the PersistKeysToStackExchangeRedis overloads:

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

Um für redis zu konfigurieren, wenden Sie eine der persistkeystoredis -über Ladungen an:To configure on Redis, call one of the PersistKeysToRedis overloads:

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

Weitere Informationen finden Sie unter den folgenden Themen:For more information, see the following topics:

RegistrierungRegistry

Gilt nur für Windows-bereit Stellungen.Only applies to Windows deployments.

Manchmal verfügt die APP möglicherweise nicht über Schreibzugriff auf das Dateisystem.Sometimes the app might not have write access to the file system. Stellen Sie sich ein Szenario vor, in dem eine App als virtuelles Dienst Konto (z. b. die Identität des App-Pools für w3wp.exe) ausgeführt wird.Consider a scenario where an app is running as a virtual service account (such as w3wp.exe's app pool identity). In diesen Fällen kann der Administrator einen Registrierungsschlüssel bereitstellen, der über die Dienst Konto Identität zugänglich ist.In these cases, the administrator can provision a registry key that's accessible by the service account identity. Nennen Sie die persistkeystoregistry -Erweiterungsmethode, wie unten gezeigt.Call the PersistKeysToRegistry extension method as shown below. Geben Sie einen RegistryKey an, der auf den Speicherort verweist, an dem kryptografische Schlüssel gespeichert werden sollen:Provide a RegistryKey pointing to the location where cryptographic keys should be stored:

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

Wichtig

Wir empfehlen die Verwendung von Windows DPAPI zum Verschlüsseln der Schlüssel im Ruhezustand.We recommend using Windows DPAPI to encrypt the keys at rest.

Entity Framework CoreEntity Framework Core

Das Microsoft. aspnetcore. dataprotection. entityframeworkcore -Paket bietet einen Mechanismus zum Speichern von Datenschutz Schlüsseln in einer Datenbank mithilfe von Entity Framework Core.The Microsoft.AspNetCore.DataProtection.EntityFrameworkCore package provides a mechanism for storing data protection keys to a database using Entity Framework Core. Das Microsoft.AspNetCore.DataProtection.EntityFrameworkCore nuget-Paket muss der Projektdatei hinzugefügt werden. es ist nicht Teil des Microsoft. aspnetcore. app-Metapakets.The Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet package must be added to the project file, it's not part of the Microsoft.AspNetCore.App metapackage.

Mit diesem Paket können Schlüssel für mehrere Instanzen einer Web-App freigegeben werden.With this package, keys can be shared across multiple instances of a web app.

Zum Konfigurieren des EF Core Anbieters müssen Sie die persistkeystodbcontext <TContext> -Methode abrufen:To configure the EF Core provider, call the PersistKeysToDbContext<TContext> method:

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

Wenn Sie möchten, dass Codekommentare in anderen Sprachen als Englisch angezeigt werden, informieren Sie uns in diesem GitHub-Issue.If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

Der generische Parameter TContext muss von dbcontext erben und idataschutzkeycontextimplementieren:The generic parameter, TContext, must inherit from DbContext and implement 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; }
    }
}

Erstellen Sie die Tabelle DataProtectionKeys.Create the DataProtectionKeys table.

Führen Sie die folgenden Befehle im Fenster Paket-Manager-Konsole (PMC) aus:Execute the following commands in the Package Manager Console (PMC) window:

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

MyKeysContextist der, der DbContext im vorangehenden Codebeispiel definiert wurde.MyKeysContext is the DbContext defined in the preceding code sample. Wenn Sie einen DbContext mit einem anderen Namen verwenden, ersetzen Sie den DbContext Namen durch MyKeysContext .If you're using a DbContext with a different name, substitute your DbContext name for MyKeysContext.

Die DataProtectionKeys Klasse/Entität übernimmt die Struktur, die in der folgenden Tabelle gezeigt wird.The DataProtectionKeys class/entity adopts the structure shown in the following table.

Eigenschaft/FeldProperty/Field CLR-TypCLR Type SQL-TypSQL Type
Id int int, PK, IDENTITY(1,1) nicht NULLint, PK, IDENTITY(1,1), not null
FriendlyName string nvarchar(MAX), NULLnvarchar(MAX), null
Xml string nvarchar(MAX), NULLnvarchar(MAX), null

Repository für benutzerdefinierte SchlüsselCustom key repository

Wenn die in-Box-Mechanismen nicht geeignet sind, kann der Entwickler einen eigenen Schlüssel Persistenzmechanismus angeben, indem er ein benutzerdefiniertes ixmlrepositorybereitstellt.If the in-box mechanisms aren't appropriate, the developer can specify their own key persistence mechanism by providing a custom IXmlRepository.