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ů:

  1. Vytvořte ochranu dat od poskytovatele ochrany dat.
  2. Volejte Protect metodu s daty, která chcete chránit.
  3. Zavolejte Unprotect metodu 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();
    }
}