Начинаем работу с API защиты данных

В самом простом проявлении защита данных выглядит вот так:

  1. Создать механизм защиты данных из провайдера.
  2. Вызвать метод Protect для данных, которые вы хотите защитить.
  3. Вызвать метод Unprotect для данных, которые вы хотите вернуть в простой текст.

Большинство фреймворков, например, ASP.NET или SignalR, сами настраивают систему защиты данных и добавляют ее в контейнер сервисов, к которому вы получаете доступ с помощью внедрения зависимостей. В следующем примере показано, как настроить контейнер сервисов для внедрения зависимостей и зарегистрировать стек защиты данных, получая провайдер защиты данных через DI, а затем создается механизм защиты данных:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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!
 */

Когда вы создаете механизм защиты, то должны предоставить один или несколько Строки purpose. Purpose-strings обеспечивают изоляцию между потребителями, например, механизм защиты, созданный с помощью purpose-string “green” не сможет работать с данными, с которыми работает механизм защиты, созданный с помощью purpose-string “purple”.

Совет

Экземпляры IDataProtectionProvider и IDataProtector можно использовать для нескольких вызывающих элементов. Когда компонент получает ссылку на IDataProtector с помощью вызова CreateProtector, он будет использовать эту ссылку для нескольких вызовов Protect и Unprotect.

Вызов Unprotect выбросит исключение CryptographicException, если защищенные данные нельзя верифицировать или расшифровать. Некоторые компоненты могут игнорировать ошибки во время операций по снятию защиты; компонент, который считывает куки аутентификации, может обработать эту ошибку и поработать с запросом, как будто у него вообще нет куки. Такие компоненты словят только исключение CryptographicException, а не все исключения.

Поделись хорошей новостью с друзьями!
Следи за новостями!