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:
- StackExchange.Redis Připojení ionMultiplexer
- Azure Redis Cache
- ukázky ochrany základních dat ASP.NET
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 virtuální účet 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 , 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; }
}
}
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
MyKeysContext
DbContext
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.