Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Dataskyddssystemet använder som standard en identifieringsmekanism för att avgöra var kryptografiska nycklar ska sparas. Utvecklaren kan åsidosätta standardidentifieringsmekanismen och manuellt ange platsen.
Varning
Om du anger en explicit plats för nyckelpersistence avregistrerar dataskyddssystemet standardnyckelkryptering i vila, så nycklar krypteras inte längre i vila. Vi rekommenderar att du dessutom anger en explicit nyckelkrypteringsmekanism för produktionsdistributioner.
Filsystem
Om du vill konfigurera en filsystembaserad nyckellagringsplats anropar du konfigurationsrutinen PersistKeysToFileSystem enligt nedan. Ange en DirectoryInfo pekar på lagringsplatsen där nycklar ska lagras:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
DirectoryInfo
Kan peka på en katalog på den lokala datorn eller peka på en mapp på en nätverksresurs. Om du pekar på en katalog på den lokala datorn (och scenariot är att endast appar på den lokala datorn behöver åtkomst för att använda den här lagringsplatsen) bör du överväga att använda Windows DPAPI (i Windows) för att kryptera nycklarna i vila. I annat fall bör du överväga att använda ett X.509-certifikat för att kryptera vilande nycklar.
Azure Storage
Azure.Extensions.AspNetCore.DataProtection.Blobs-paketet tillåter lagring av dataskyddsnycklar i Azure Blob Storage. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
Om du vill konfigurera Azure Blob Storage-providern anropar du en av överlagringarna PersistKeysToAzureBlobStorage .
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}
Om webbappen körs som en Azure-tjänst kan anslutningssträngen användas för att autentisera till Azure Storage med hjälp av Azure.Storage.Blobs.
Varning
Den här artikeln visar användningen av anslutningssträngar. Med en lokal databas behöver användaren inte autentiseras, men i produktion innehåller anslutningssträngar ibland ett lösenord för att autentisera. En resursägares lösenordsautentiseringsuppgifter (ROPC) är en säkerhetsrisk som bör undvikas i produktionsdatabaser. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för appar som distribueras till test- eller produktionsmiljöer finns i Säkra autentiseringsflöden.
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);
Anmärkning
Anslutningssträngen till ditt lagringskonto finns i Azure-portalen under avsnittet "Åtkomstnycklar" eller genom att köra följande CLI-kommando:
az storage account show-connection-string --name <account_name> --resource-group <resource_group>
Redis
Med paketet Microsoft.AspNetCore.DataProtection.StackExchangeRedis kan du lagra dataskyddsnycklar i en Redis-cache. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
Paketet Microsoft.AspNetCore.DataProtection.Redis tillåter lagring av dataskyddsnycklar i en Redis-cache. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
För att konfigurera Redis kan du anropa en av överlagringarna PersistKeysToStackExchangeRedis.
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
För att konfigurera i Redis, anropa en av överlagringarna PersistKeysToRedis.
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToRedis(redis, "DataProtection-Keys");
}
Mer information finns i följande avsnitt:
Registeringssystem
gäller endast för Windows-distributioner.
Ibland kanske appen inte har skrivåtkomst till filsystemet. Tänk dig ett scenario där en app körs som ett virtuellt tjänstkonto (till exempel w3wp.exe apppoolsidentitet). I dessa fall kan administratören tilldela en registernyckel som är tillgänglig för tjänstekontots identitet. PersistKeysToRegistry Anropa tilläggsmetoden enligt nedan. Ange en RegistryKey pekar på den plats där kryptografiska nycklar ska lagras:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Viktigt!
Vi rekommenderar att du använder Windows DPAPI för att kryptera nycklarna i vila.
Entity Framework Core
Paketet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore tillhandahåller en mekanism för att lagra dataskyddsnycklar till en databas med Entity Framework Core.
Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
NuGet-paketet måste läggas till i projektfilen, det är inte en del av Microsoft.AspNetCore.App metapaket.
Med det här paketet kan nycklar delas mellan flera instanser av en webbapp.
Om du vill konfigurera providern EF Core anropar du PersistKeysToDbContext metoden:
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);
}
Om du vill se kodkommentar översatta till andra språk än engelska kan du meddela oss i det här GitHub-diskussionsproblemet.
Den generiska parametern , TContext
måste ärva från DbContext och implementera 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
Skapa tabellen.
Kör följande kommandon i fönstret Package Manager Console (PMC):
Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext
MyKeysContext
är DbContext
definierat i föregående kodexempel. Om du använder ett DbContext
med ett annat namn ersätter du ditt DbContext
namn med MyKeysContext
.
Klassen DataProtectionKeys
/entiteten antar strukturen som visas i följande tabell.
Egenskap/fält | CLR-typ | SQL-typ |
---|---|---|
Id |
int |
int , PK, IDENTITY(1,1) , inte null |
FriendlyName |
string |
nvarchar(MAX) noll |
Xml |
string |
nvarchar(MAX) noll |
Lagringsplats för anpassad nyckel
Om de inbyggda mekanismerna inte är lämpliga kan utvecklaren ange sin egen mekanism för nyckelvaraktighet genom att tillhandahålla en anpassad IXmlRepository.
ASP.NET Core