Přehled rozhraní API pro uživatele pro ASP.NET Core

Rozhraní IDataProtectionProvider IDataProtector a jsou základní rozhraní, prostřednictvím kterých uživatelé používají systém ochrany dat. Jsou umístěné v balíčku Microsoft.AspNetCore.DataProtection.Abstractions.

IDataProtectionProvider

Rozhraní poskytovatele představuje kořen systému ochrany dat. Nelze ji přímo použít k ochraně nebo zrušení ochrany dat. Místo toho musí příjemce získat odkaz na voláním , kde účel je řetězec, který popisuje IDataProtector IDataProtectionProvider.CreateProtector(purpose) zamýšlený případ použití příjemce. Další informace o záměru tohoto parametru a o tom, jak zvolit vhodnou hodnotu, najdete v tématu Účelové řetězce.

IDataProtector

Rozhraní ochrany je vráceno voláním a je to toto rozhraní, které spotřebiteli mohou použít k provádění operací ochrany a CreateProtector zrušení ochrany.

Pokud chcete chránit část dat, předejte je Protect metodě . Základní rozhraní definuje metodu, která převádí byte[] -> byte[], ale existuje také přetížení (poskytované jako rozšiřující metoda), které převádí řetězec -> řetězec. Zabezpečení nabízené oběma metodami je identické. Vývojář by měl zvolit, které přetížení je pro jeho případ použití nejvhodnější. Bez ohledu na zvolené přetížení je teď hodnota vrácená metodou Protect chráněná (šifrovaná a chráněná proti manipulaci) a aplikace ji může odeslat nedůvěryhodnému klientovi.

Pokud chcete zrušit ochranu dříve chráněné části dat, předejte chráněná data Unprotect metodě . (Pro usnadnění vývojářů existují přetížení založená na byte[] a řetězcových přetíženích.) Pokud byla chráněná datová část vygenerována předchozím voláním metody na stejné , metoda vrátí původní Protect IDataProtector Unprotect nechráněnou datovou část. Pokud byla chráněná datová část manipulována s jinou datovou část nebo byla vytvořena jiným objektem , vyvolá metoda IDataProtector Unprotect CryptographicException.

Koncept stejného vs. IDataProtector odlišného sádá k konceptu účelu. Pokud byly dvě instance vygenerovány ze stejného kořenového adresáře, ale prostřednictvím řetězců s různým účelem ve volání metody , považují se za různé ochrany a jedna z nich nebude moct zrušit ochranu datové části generované IDataProtector IDataProtectionProvider IDataProtectionProvider.CreateProtector druhou.

Využívání těchto rozhraní

U komponenty podporující diody je zamýšlené použití, že komponenta přebírá parametr ve svém konstruktoru a systém IN automaticky poskytuje tuto službu při IDataProtectionProvider vytvoření instance komponenty.

Poznámka

Některé aplikace (například konzolové aplikace nebo aplikace ASP.NET 4.x) nemusí rozvědky DI, takže nemohou použít zde popsaný mechanismus. V těchto scénářích najdete další informace o získání instance poskytovatele bez nutnosti procházet diody v dokumentu Scénáře bez IDataProtection diody.

Následující ukázka ukazuje tři koncepty:

  1. Přidejte systém ochrany dat do kontejneru služby.

  2. Použití DI k příjmu instance , a IDataProtectionProvider

  3. Vytvoření z IDataProtector a jeho použití k ochraně a zrušení ochrany IDataProtectionProvider 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!
 */

Balíček Microsoft.AspNetCore.DataProtection.Abstractions obsahuje rozšiřující metodu pro usnadnění pro IServiceProvider.GetDataProtector vývojáře. Zapouzdřuje jako jednu operaci načtení z poskytovatele služby i IDataProtectionProvider volání IDataProtectionProvider.CreateProtector . Následující příklad ukazuje jeho použití.

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}");
    }
}

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.