ASP.NET Core 中的数据保护 Api 入门Get started with the Data Protection APIs in ASP.NET Core

本文内容

最简单的是保护数据,包括以下步骤:

  • 从数据保护提供程序创建数据保护程序。

  • 用要保护的数据调用 Protect 方法。

  • 用要返回到纯文本的数据调用 Unprotect 方法。

大多数框架和应用模型(如 ASP.NET Core 或 SignalR)已配置数据保护系统,并将其添加到通过依赖关系注入访问的服务容器。下面的示例演示如何为依赖关系注入配置服务容器并注册数据保护堆栈,通过 DI 接收数据保护提供程序,创建保护程序并保护然后取消保护数据。

  1. using System;
  2. using Microsoft.AspNetCore.DataProtection;
  3. using Microsoft.Extensions.DependencyInjection;
  4. public class Program
  5. {
  6. public static void Main(string[] args)
  7. {
  8. // add data protection services
  9. var serviceCollection = new ServiceCollection();
  10. serviceCollection.AddDataProtection();
  11. var services = serviceCollection.BuildServiceProvider();
  12. // create an instance of MyClass using the service provider
  13. var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
  14. instance.RunSample();
  15. }
  16. public class MyClass
  17. {
  18. IDataProtector _protector;
  19. // the 'provider' parameter is provided by DI
  20. public MyClass(IDataProtectionProvider provider)
  21. {
  22. _protector = provider.CreateProtector("Contoso.MyClass.v1");
  23. }
  24. public void RunSample()
  25. {
  26. Console.Write("Enter input: ");
  27. string input = Console.ReadLine();
  28. // protect the payload
  29. string protectedPayload = _protector.Protect(input);
  30. Console.WriteLine($"Protect returned: {protectedPayload}");
  31. // unprotect the payload
  32. string unprotectedPayload = _protector.Unprotect(protectedPayload);
  33. Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
  34. }
  35. }
  36. }
  37. /*
  38. * SAMPLE OUTPUT
  39. *
  40. * Enter input: Hello world!
  41. * Protect returned: CfDJ8ICcgQwZZhlAlTZT...OdfH66i1PnGmpCR5e441xQ
  42. * Unprotect returned: Hello world!
  43. */

创建保护程序时,必须提供一个或多个目的字符串用途字符串提供使用者之间的隔离。例如,使用 "绿色" 目的字符串创建的保护程序将无法取消保护由 "紫色" 目的的保护程序提供的数据。

提示

IDataProtectionProviderIDataProtector 的实例对于多个调用方是线程安全的。它的目的是,在组件通过调用 CreateProtector获取对 IDataProtector 的引用时,它会将该引用用于多次调用 ProtectUnprotect

如果无法验证或解密受保护的有效负载,则对 Unprotect 的调用将引发 System.security.cryptography.cryptographicexception。某些组件可能希望在取消保护操作期间忽略错误;读取身份验证 cookie 的组件可能会处理此错误,并将请求视为根本没有 cookie,而不是完全失败的请求。需要此行为的组件应专门捕获 System.security.cryptography.cryptographicexception,而不是抑制所有异常。