Megosztás a következőn keresztül:


Az adatvédelmi API-k használatának első lépései a ASP.NET Core-ban

Az adatok védelme alapvetően a következő lépésekből áll:

  1. Hozzon létre egy adatvédőt egy adatvédelmi szolgáltatótól.
  2. Hívja meg a metódust Protect a védeni kívánt adatokkal.
  3. Hívja meg a Unprotect metó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();
    }
}