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