Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az adatok védelme alapvetően a következő lépésekből áll:
- Hozzon létre egy adatvédőt egy adatvédelmi szolgáltatótól.
- Hívja meg a metódust
Protecta védeni kívánt adatokkal. - Hívja meg a
Unprotectmetódust azokkal az adatokkal, amelyeket egyszerű szöveggé szeretne alakítani.
A legtöbb keretrendszer és alkalmazásmodell, például a ASP.NET Core vagy SignalR, már konfigurálja az adatvédelmi rendszert, és hozzáadja azt egy függőséginjektálással elérhető szolgáltatástárolóhoz. Az alábbi minta a következőket mutatja be:
- Szolgáltatás konténer konfigurálása függőséginjektáláshoz és az adatvédelmi modul regisztrálása.
- Az adatvédelmi szolgáltató fogadása a DI-en keresztül.
- Védő létrehozása.
- Az adatok védelme, majd védettségének megszüntetése.
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!
*/
Védő létrehozásakor egy vagy több célsztringet kell megadnia. A célsztring elkülönítést biztosít a felhasználók között. Például egy "zöld" célú védővel létrehozott védő nem tudja feloldani a "lila" célú védő által biztosított adatokat.
Jótanács
IDataProtectionProvider és IDataProtector példányai szálbiztosak több hívó számára. A cél az, hogy ha egy összetevő egy híváson IDataProtector keresztül kap egy hivatkozást, CreateProtector, akkor ezt a hivatkozást használja majd több híváshoz Protect és Unprotect.
A Unprotect meghívása CryptographicException kivételt dob, ha a védett hasznos terheket nem lehet ellenőrizni vagy visszafejteni. Egyes összetevők figyelmen kívül hagyhatják a hibákat a feloldási műveletek során; egy, a hitelesítési cookie-kat olvasó összetevő kezelheti ezt a hibát, és a kérést úgy kezelheti, mintha egyáltalán nem cookie lenne, ahelyett hogy a kérés meghiúsulna. Azoknak az összetevőknek, amelyek ezt a viselkedést szeretnék használni, kifejezetten a CryptographicException-t kell elkapniuk ahelyett, hogy minden kivételt lenyelnek.
Egyéni adattár konfigurálása az AddOptions használatával
Vegye figyelembe a következő kódot, amely egy szolgáltatót használ, mert a megvalósítás IXmlRepository függ egy szinguleton szolgáltatástól:
public void ConfigureServices(IServiceCollection services)
{
// ...
var sp = services.BuildServiceProvider();
services.AddDataProtection()
.AddKeyManagementOptions(o => o.XmlRepository = sp.GetService<IXmlRepository>());
}
Az előző kód a következő figyelmeztetést naplózza:
A BuildServiceProvider alkalmazáskódból való meghívásával létrejön a singleton-szolgáltatások további példánya. Fontolja meg az olyan alternatív megoldásokat, mint a függőségi injektálási szolgáltatások a "Konfigurálás" paramétereként.
Az alábbi kód biztosítja a megvalósítást IXmlRepository anélkül, hogy fel kellene építenie a szolgáltatót, és így további példányokat kellene készítenie a singleton szolgáltatásokról.
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();
}
Az előző kód eltávolítja a GetService hívását, és elrejti a IConfigureOptions<T>.
Az alábbi kód az egyéni XML-adattárat mutatja be:
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();
}
}
}
Az alábbi kód az XmlKey osztályt mutatja be:
public class XmlKey
{
public Guid Id { get; set; }
public string Xml { get; set; }
public XmlKey()
{
this.Id = Guid.NewGuid();
}
}