Wprowadzenie do interfejsów API ochrony danych w ASP.NET CoreGet started with the Data Protection APIs in ASP.NET Core

W najprostszym zakresie Ochrona danych obejmuje następujące kroki:At its simplest, protecting data consists of the following steps:

  1. Utwórz funkcję ochrony danych z poziomu dostawcy ochrony danych.Create a data protector from a data protection provider.

  2. Wywołaj Protect metodę z danymi, które chcesz chronić.Call the Protect method with the data you want to protect.

  3. Wywołaj Unprotect metodę z danymi, które chcesz wrócić do zwykłego tekstu.Call the Unprotect method with the data you want to turn back into plain text.

Większość platform i modeli aplikacji, takich jak ASP.NET Core lub SignalR , już skonfigurowano system ochrony danych i dodaje go do kontenera usługi, do którego uzyskuje dostęp za pośrednictwem iniekcji zależności.Most frameworks and app models, such as ASP.NET Core or SignalR, already configure the data protection system and add it to a service container you access via dependency injection. Poniższy przykład demonstruje skonfigurowanie kontenera usługi pod kątem iniekcji zależności i rejestrowanie stosu ochrony danych, otrzymywanie dostawcy ochrony danych za pośrednictwem programu DI, utworzenie funkcji ochrony i ochronę danych.The following sample demonstrates configuring a service container for dependency injection and registering the data protection stack, receiving the data protection provider via DI, creating a protector and protecting then unprotecting data.

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!
 */

Podczas tworzenia funkcji ochrony należy podać co najmniej jeden ciąg przeznaczenia.When you create a protector you must provide one or more Purpose Strings. Ciąg celu zapewnia izolację między użytkownikami.A purpose string provides isolation between consumers. Na przykład funkcja ochrony utworzona z przeznaczeniem ciągu "Green" nie może wyłączyć ochrony danych dostarczonych przez funkcję ochrony w celu "purpurowego".For example, a protector created with a purpose string of "green" wouldn't be able to unprotect data provided by a protector with a purpose of "purple".

Porada

Wystąpienia IDataProtectionProvider i IDataProtector są bezpieczne dla wątków dla wielu wywołań.Instances of IDataProtectionProvider and IDataProtector are thread-safe for multiple callers. Jest to zamierzone, gdy składnik pobiera odwołanie do elementu IDataProtector za pośrednictwem wywołania do CreateProtector , będzie używać tego odwołania dla wielu wywołań do Protect i Unprotect .It's intended that once a component gets a reference to an IDataProtector via a call to CreateProtector, it will use that reference for multiple calls to Protect and Unprotect.

Wywołanie będzie zgłaszać Unprotect CryptographicException, jeśli nie można zweryfikować ani deszyfrowanie chronionego ładunku.A call to Unprotect will throw CryptographicException if the protected payload cannot be verified or deciphered. Niektóre składniki mogą chcieć zignorować błędy podczas operacji usunięcia ochrony; składnik, który odczytuje uwierzytelnianie cookie s, może obsłużyć ten błąd i traktować żądanie tak, jakby nie było cookie w ogóle kończyć się niepowodzeniem.Some components may wish to ignore errors during unprotect operations; a component which reads authentication cookies might handle this error and treat the request as if it had no cookie at all rather than fail the request outright. Składniki, które chcą tego zachowania, powinny zwrócić uwagę na CryptographicException zamiast połknięcia wszystkich wyjątków.Components which want this behavior should specifically catch CryptographicException instead of swallowing all exceptions.