Začínáme s rozhraními API pro ochranu dat v ASP.NET Core
Ochrana dat se v podstatě skládá z následujících kroků:
- Vytvořte ochranu dat od poskytovatele ochrany dat.
- Volejte
Protectmetodu s daty, která chcete chránit. - Zavolejte
Unprotectmetodu s daty, která chcete přeměnit zpět na prostý text.
Většina architektur a modelů aplikací, například ASP.NET Core nebo , už konfiguruje systém ochrany dat a přidá ho do kontejneru služby, ke které se přistupuje prostřednictvím injektáže SignalR závislostí. Následující ukázka ukazuje:
- Konfigurace kontejneru služby pro injektáž závislostí a registrace zásobníku ochrany dat
- Příjem poskytovatele ochrany dat prostřednictvím zprostředkovatelů identity
- Vytvoření ochrany.
- Ochrana a zrušení ochrany dat.
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!
*/
Při vytváření ochrany je nutné zadat jeden nebo více řetězců účelu. Účelový řetězec poskytuje izolaci mezi spotřebiteli. Například ochrana vytvořená s účelovým řetězcem "zelená" by nebyla schopna zrušit ochranu dat poskytovaných ochranou za účelem "fialové".
Tip
Instance a IDataProtectionProvider jsou bezpečné pro více IDataProtector volajících. Je zamýšleno, že jakmile komponenta získá odkaz na prostřednictvím volání , použije tento odkaz pro více volání a IDataProtector CreateProtector Protect Unprotect .
Volání vyvolá Unprotect výjimku CryptographicException, pokud chráněnou datovou část nelze ověřit nebo dešifrovat. Některé komponenty mohou chtít ignorovat chyby během operací zrušení ochrany. Komponenta, která čte ověřovací y, může tuto chybu zpracovat a považovat požadavek za naprostou cookie cookie neschůdný. Komponenty, které chtějí toto chování, by měly konkrétně zachytit výjimku CryptographicException místo zachytění všech výjimek.
Konfigurace vlastního úložiště pomocí AddOptions
Představte si následující kód, který používá poskytovatele služeb, protože implementace má závislost IXmlRepository na jednosměnné službě:
public void ConfigureServices(IServiceCollection services)
{
// ...
var sp = services.BuildServiceProvider();
services.AddDataProtection()
.AddKeyManagementOptions(o => o.XmlRepository = sp.GetService<IXmlRepository>());
}
Předchozí kód zaznamená následující upozornění:
Volání BuildServiceProvider z kódu aplikace má za výsledek vytvoření další kopie jedné instance služeb. Jako parametry konfigurace zvažte alternativy, jako je vkládání závislostí služeb.
Následující kód poskytuje implementaci bez nutnosti vytvářet poskytovatele služeb a vytvářet tak další kopie IXmlRepository jednosměnné služby:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataProtectionDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// Register XmlRepository for data protection.
services.AddOptions<KeyManagementOptions>()
.Configure<IServiceScopeFactory>((options, factory) =>
{
options.XmlRepository = new CustomXmlRepository(factory);
});
services.AddRazorPages();
}
Předchozí kód odebere volání a GetService skryje IConfigureOptions<T> .
Následující kód ukazuje vlastní úložiště XML:
using CustomXMLrepo.Data;
using Microsoft.AspNetCore.DataProtection.Repositories;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
public class CustomXmlRepository : IXmlRepository
{
private readonly IServiceScopeFactory factory;
public CustomXmlRepository(IServiceScopeFactory factory)
{
this.factory = factory;
}
public IReadOnlyCollection<XElement> GetAllElements()
{
using (var scope = factory.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<DataProtectionDbContext>();
var keys = context.XmlKeys.ToList()
.Select(x => XElement.Parse(x.Xml))
.ToList();
return keys;
}
}
public void StoreElement(XElement element, string friendlyName)
{
var key = new XmlKey
{
Xml = element.ToString(SaveOptions.DisableFormatting)
};
using (var scope = factory.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<DataProtectionDbContext>();
context.XmlKeys.Add(key);
context.SaveChanges();
}
}
}
Následující kód ukazuje třídu XmlKey:
public class XmlKey
{
public Guid Id { get; set; }
public string Xml { get; set; }
public XmlKey()
{
this.Id = Guid.NewGuid();
}
}