Not
Å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.
Gränssnitten IDataProtectionProvider och IDataProtector är de grundläggande gränssnitt genom vilka konsumenterna använder dataskyddssystemet. De finns i paketet Microsoft.AspNetCore.DataProtection.Abstractions .
IDataProtectionProvider
Providergränssnittet representerar roten i dataskyddssystemet. Den kan inte användas direkt för att skydda eller ta bort skydd mot data. I stället måste konsumenten hämta en referens till en IDataProtector genom att anropa IDataProtectionProvider.CreateProtector(purpose), där syftet är en sträng som beskriver det avsedda konsumentanvändningsfallet. Se Användningssträngar för mycket mer information om avsikten med den här parametern och hur du väljer ett lämpligt värde.
IDataProtector
Skyddsgränssnittet returneras av ett anrop till CreateProtector, och det är det här gränssnittet som konsumenter kan använda för att utföra skydds- och oskyddade åtgärder.
För att skydda en del data skickar du data till Protect metoden. Det grundläggande gränssnittet definierar en metod som konverterar byte[] -> byte[], men det finns också en överlagrad metod (en tilläggsmetod) som konverterar sträng -> sträng. Säkerheten som erbjuds av de två metoderna är identisk; utvecklaren bör välja vilken överlagring som passar bäst för deras användningsfall. Oavsett vilken överbelastning som valts är det värde som returneras av Protect-metoden nu skyddat (krypterat och förfalskningsskyddat) och programmet kan skicka det till en obetrodd klient.
Om du vill ta bort skyddet av ett tidigare skyddat datastycke skickar du skyddade data till Unprotect metoden. (Det finns byte[]-baserade och strängbaserade överlagringar för utvecklarens bekvämlighet.) Om den skyddade nyttolasten genererades av ett tidigare anrop till Protect på samma IDataProtectorsätt Unprotect returnerar metoden den ursprungliga oskyddade nyttolasten. Om den skyddade nyttolasten har manipulerats eller skapats av en annan IDataProtector, Unprotect genererar metoden CryptographicException.
Begreppet samma kontra olika IDataProtector kopplas tillbaka till begreppet syfte. Om två IDataProtector instanser genererades från samma rot IDataProtectionProvider men via olika syften i anropen till IDataProtectionProvider.CreateProtector, betraktas de som olika skyddsinstanser, och den ena kommer inte att kunna ta bort skyddet från nyttolaster som genereras av den andra.
Förbruka dessa gränssnitt
För en DI-medveten komponent är den avsedda användningen att komponenten tar en IDataProtectionProvider parameter i konstruktorn och att DI-systemet automatiskt tillhandahåller den här tjänsten när komponenten instansieras.
Anmärkning
Vissa program (till exempel konsolprogram eller ASP.NET 4.x-program) kanske inte är DI-medvetna, så de kan inte använda den mekanism som beskrivs här. För dessa scenarier, konsultera dokumentet Icke DI-medvetna scenarier för mer information om hur du hämtar en instans av en IDataProtection provider utan att gå via DI.
Följande exempel visar tre begrepp:
Lägg till dataskyddssystemet i tjänstcontainern,
Genom att använda DI för att ta emot en instans av en
IDataProtectionProvider, ochSkapa en
IDataProtectorfrån enIDataProtectionProvideroch använda den för att skydda och ta bort skydd mot data.
Konsolapp
using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection();
var services = serviceCollection.BuildServiceProvider();
// create an instance of MyClass using the service provider
var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
instance.RunSample();
}
public class MyClass
{
IDataProtector _protector;
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
public void RunSample()
{
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
}
}
}
/*
* SAMPLE OUTPUT
*
* Enter input: Hello world!
* Protect returned: CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ
* Unprotect returned: Hello world!
*/
Webbapp
Ring AddDataProtection(IServiceCollection, Action<DataProtectionOptions>) in Program.cs:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddDataProtection();
var app = builder.Build();
Följande markerade kod visar hur du använder IDataProtector i en kontrollant:
public class HomeController : Controller
{
private readonly IDataProtector _dataProtector;
public HomeController(IDataProtectionProvider dataProtectionProvider)
{
_dataProtector = dataProtectionProvider.CreateProtector("HomeControllerPurpose");
}
// ...
public IActionResult Privacy()
{
// The original data to protect
string originalData = "original data";
// Protect the data (encrypt)
string protectedData = _dataProtector.Protect(originalData);
Console.WriteLine($"Protected Data: {protectedData}");
// Unprotect the data (decrypt)
string unprotectedData = _dataProtector.Unprotect(protectedData);
Console.WriteLine($"Unprotected Data: {unprotectedData}");
return View();
}
// ...
Paketet Microsoft.AspNetCore.DataProtection.Abstractions innehåller en tilläggsmetod GetDataProtector som en bekvämlighet för utvecklare. Som en enda åtgärd kapslar den in både hämtning av en IDataProtectionProvider från tjänstleverantören och anrop av IDataProtectionProvider.CreateProtector. Följande exempel visar dess användning:
using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection();
var services = serviceCollection.BuildServiceProvider();
// get an IDataProtector from the IServiceProvider
var protector = services.GetDataProtector("Contoso.Example.v2");
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
}
}
Tips/Råd
Instanser av IDataProtectionProvider och IDataProtector är trådsäkra för flera anropare. Det är avsett att när en komponent hämtar en referens till en IDataProtector via ett anrop till CreateProtectoranvänder den referensen för flera anrop till Protect och Unprotect. Ett anrop till Unprotect genererar CryptographicException om den skyddade nyttolasten inte kan verifieras eller dechiffreras. Vissa komponenter kanske vill ignorera fel under oskyddade åtgärder. en komponent som läser autentiseringscookies kan hantera det här felet och behandla begäran som om den inte alls hade någon cookie i stället för att misslyckas med begäran direkt. Komponenter som vill ha det här beteendet bör specifikt fånga CryptographicException i stället för att svälja alla undantag.
ASP.NET Core