Introducción a las API de consumidor para ASP.NET Core
Las IDataProtectionProvider IDataProtector interfaces y son las interfaces básicas a través de las cuales los consumidores usan el sistema de protección de datos. Se encuentran en el paquete Microsoft.AspNetCore.DataProtection.Abstractions.
IDataProtectionProvider
La interfaz del proveedor representa la raíz del sistema de protección de datos. No se puede usar directamente para proteger o desproteger datos. En su lugar, el consumidor debe obtener una referencia a mediante una llamada a , donde purpose es una cadena que describe el caso IDataProtector de uso del consumidor IDataProtectionProvider.CreateProtector(purpose) previsto. Consulte Cadenas de propósito para obtener mucha más información sobre la intención de este parámetro y cómo elegir un valor adecuado.
IDataProtector
La interfaz protector se devuelve mediante una llamada a y es esta interfaz la que los consumidores pueden usar para realizar operaciones CreateProtector de protección y desprotección.
Para proteger un fragmento de datos, pase los datos al Protect método . La interfaz básica define un método que convierte byte[] -> byte[], pero también hay una sobrecarga (proporcionada como método de extensión) que convierte string -> string. La seguridad que ofrecen los dos métodos es idéntica; el desarrollador debe elegir la sobrecarga más conveniente para su caso de uso. Independientemente de la sobrecarga elegida, el valor devuelto por el método Protect ahora está protegido (cifrado y a prueba de manipulaciones) y la aplicación puede enviarlo a un cliente que no es de confianza.
Para desproteger un fragmento de datos previamente protegido, pase los datos protegidos al Unprotect método . (Hay sobrecargas basadas en bytes[]y basadas en cadenas para mayor comodidad del desarrollador). Si la carga protegida se generó mediante una llamada anterior a en este mismo , el método Protect IDataProtector devolverá la carga Unprotect desprotegida original. Si la carga protegida ha sido alterada o producida por otro , el método IDataProtector Unprotect producirá CryptographicException.
El concepto de igual frente a diferente IDataProtector se vincula con el concepto de propósito. Si se generaron dos instancias de la misma raíz pero a través de cadenas de propósito diferentes en la llamada a , se consideran protectores diferentes y uno no podrá desproteger las cargas generadas por IDataProtector IDataProtectionProvider el IDataProtectionProvider.CreateProtector otro.
Consumo de estas interfaces
En el caso de un componente que tiene en cuenta la inserción de inserción de datos, el uso previsto es que el componente toma un parámetro en su constructor y que el sistema de inserción de inserción de datos proporciona automáticamente este servicio cuando se crea una instancia IDataProtectionProvider del componente.
Nota
Es posible que algunas aplicaciones (como las aplicaciones de consola o ASP.NET 4.x) no sean conscientes de la di di, por lo que no pueden usar el mecanismo descrito aquí. Para estos escenarios, consulte el documento Escenarios que no tienen en cuenta la di para obtener más información sobre cómo obtener una instancia de un IDataProtection proveedor sin pasar por LA.
En el ejemplo siguiente se muestran tres conceptos:
Agregue el sistema de protección de datos al contenedor de servicios.
Uso de DI para recibir una instancia de
IDataProtectionProvideryCrear un
IDataProtectora partir de y usarlo para proteger yIDataProtectionProviderdesproteger datos.
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!
*/
El paquete Microsoft.AspNetCore.DataProtection.Abstractions contiene un método de extensión IServiceProvider.GetDataProtector como comodidad para el desarrollador. Encapsula como una sola operación recuperando un del proveedor de IDataProtectionProvider servicios y llamando a IDataProtectionProvider.CreateProtector . En el ejemplo siguiente se muestra su uso.
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}");
}
}
Sugerencia
Las instancias de IDataProtectionProvider y IDataProtector son seguras para subprocesos para varios llamadores. Se pretende que una vez que un componente obtiene una referencia a mediante una llamada a , usará esa referencia para varias llamadas a IDataProtector CreateProtector y Protect Unprotect . Una llamada a produce cryptographicException si no se puede comprobar o descifrar la carga Unprotect protegida. Es posible que algunos componentes deseen omitir los errores durante las operaciones de desprotección. Un componente que lee los de autenticación podría controlar este error y tratar la solicitud como si no tuviera ninguna en lugar de producir un error directo en cookie cookie la solicitud. Los componentes que desean este comportamiento deben detectar específicamente CryptographicException en lugar de evitar todas las excepciones.