Начинаем работу с API защиты данных¶
В самом простом проявлении защита данных выглядит вот так:
- Создать механизм защиты данных из провайдера.
- Вызвать метод Protect для данных, которые вы хотите защитить.
- Вызвать метод 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, а не все исключения.