Icke-DI-medvetna scenarier för dataskydd i ASP.NET Core
ASP.NET Core Data Protection-systemet läggs normalt till i en tjänstcontainer och förbrukas av beroendekomponenter via beroendeinjektion (DI). Det finns dock fall där detta inte är möjligt eller önskvärt, särskilt när du importerar systemet till en befintlig app.
För att stödja dessa scenarier tillhandahåller Microsoft.AspNetCore.DataProtection.Extensions-paketet en konkret typ, DataProtectionProvider, som erbjuder ett enkelt sätt att använda dataskydd utan att förlita sig på DI. Typen DataProtectionProvider
implementerar IDataProtectionProvider. För att skapa DataProtectionProvider
krävs endast en DirectoryInfo instans för att ange var leverantörens kryptografiska nycklar ska lagras, enligt följande kodexempel:
using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
public class Program
{
public static void Main(string[] args)
{
// Get the path to %LOCALAPPDATA%\myapp-keys
var destFolder = Path.Combine(
System.Environment.GetEnvironmentVariable("LOCALAPPDATA"),
"myapp-keys");
// Instantiate the data protection system at this folder
var dataProtectionProvider = DataProtectionProvider.Create(
new DirectoryInfo(destFolder));
var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
Console.Write("Enter input: ");
var input = Console.ReadLine();
// Protect the payload
var protectedPayload = protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// Unprotect the payload
var unprotectedPayload = protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
Console.WriteLine();
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
/*
* SAMPLE OUTPUT
*
* Enter input: Hello world!
* Protect returned: CfDJ8FWbAn6...ch3hAPm1NJA
* Unprotect returned: Hello world!
*
* Press any key...
*/
Som standard krypterar den konkreta typen DataProtectionProvider
inte rå nyckelmaterial innan det lagras i filsystemet. Detta är till stöd för scenarier där utvecklaren pekar på en nätverksresurs och dataskyddssystemet inte automatiskt kan härleda en lämplig krypteringsmekanism för vilande nyckel.
Dessutom isolerar inte DataProtectionProvider
betongtyp appar som standard. Alla appar som använder samma nyckelkatalog kan dela nyttolaster så länge deras syftesparametrar matcha.
Konstruktorn DataProtectionProvider accepterar ett valfritt konfigurationsåteranrop som kan användas för att justera systemets beteende. Exemplet nedan visar återställning av isolering med ett explicit anrop till SetApplicationName. Exemplet visar också hur du konfigurerar systemet för att automatiskt kryptera beständiga nycklar med hjälp av Windows DPAPI. Om katalogen pekar på en UNC-resurs kanske du vill distribuera ett delat certifikat över alla relevanta datorer och konfigurera systemet att använda certifikatbaserad kryptering med ett anrop till ProtectKeysWithCertificate.
using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
public class Program
{
public static void Main(string[] args)
{
// Get the path to %LOCALAPPDATA%\myapp-keys
var destFolder = Path.Combine(
System.Environment.GetEnvironmentVariable("LOCALAPPDATA"),
"myapp-keys");
// Instantiate the data protection system at this folder
var dataProtectionProvider = DataProtectionProvider.Create(
new DirectoryInfo(destFolder),
configuration =>
{
configuration.SetApplicationName("my app name");
configuration.ProtectKeysWithDpapi();
});
var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
Console.Write("Enter input: ");
var input = Console.ReadLine();
// Protect the payload
var protectedPayload = protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// Unprotect the payload
var unprotectedPayload = protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
Console.WriteLine();
Console.WriteLine("Press any key...");
Console.ReadKey();
}
}
Tips
Instanser av DataProtectionProvider
betongtyp är dyra att skapa. Om en app har flera instanser av den här typen och om de alla använder samma nyckellagringskatalog kan appprestanda försämras. Om du använder DataProtectionProvider
typ rekommenderar vi att du skapar den här typen en gång och återanvänder den så mycket som möjligt. Den DataProtectionProvider
typen och alla IDataProtector instanser som skapats från den är trådsäkra för flera anropare.
ASP.NET Core