ASP.NET Core 中的临时数据保护提供程序Ephemeral data protection providers in ASP.NET Core

本文内容

在某些情况下,应用程序需要一次性 IDataProtectionProvider例如,开发人员可能只是在一次性的控制台应用程序中试验,或者应用程序本身是暂时性的(它已编写脚本或单元测试项目)。为支持这些方案, AspNetCore. DataProtection包包括 EphemeralDataProtectionProvider类型。此类型提供 IDataProtectionProvider 的基本实现,其密钥存储库仅保存在内存中,而不会写出到任何后备存储。

EphemeralDataProtectionProvider 的每个实例都使用其自己的唯一主密钥。因此,如果 IDataProtector 的根 EphemeralDataProtectionProvider 生成受保护的负载,则该负载只能由根同一 EphemeralDataProtectionProvider 实例的等效 IDataProtector (给定相同的用途链)进行保护。

下面的示例演示如何实例化 EphemeralDataProtectionProvider 并使用它来保护和取消保护数据。

  1. using System;
  2. using Microsoft.AspNetCore.DataProtection;
  3. public class Program
  4. {
  5. public static void Main(string[] args)
  6. {
  7. const string purpose = "Ephemeral.App.v1";
  8. // create an ephemeral provider and demonstrate that it can round-trip a payload
  9. var provider = new EphemeralDataProtectionProvider();
  10. var protector = provider.CreateProtector(purpose);
  11. Console.Write("Enter input: ");
  12. string input = Console.ReadLine();
  13. // protect the payload
  14. string protectedPayload = protector.Protect(input);
  15. Console.WriteLine($"Protect returned: {protectedPayload}");
  16. // unprotect the payload
  17. string unprotectedPayload = protector.Unprotect(protectedPayload);
  18. Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
  19. // if I create a new ephemeral provider, it won't be able to unprotect existing
  20. // payloads, even if I specify the same purpose
  21. provider = new EphemeralDataProtectionProvider();
  22. protector = provider.CreateProtector(purpose);
  23. unprotectedPayload = protector.Unprotect(protectedPayload); // THROWS
  24. }
  25. }
  26. /*
  27. * SAMPLE OUTPUT
  28. *
  29. * Enter input: Hello!
  30. * Protect returned: CfDJ8AAAAAAAAAAAAAAAAAAAAA...uGoxWLjGKtm1SkNACQ
  31. * Unprotect returned: Hello!
  32. * << throws CryptographicException >>
  33. */