ASP.NET Core 中的临时数据保护提供程序Ephemeral data protection providers in ASP.NET Core
本文内容
在某些情况下,应用程序需要一次性 IDataProtectionProvider
。例如,开发人员可能只是在一次性的控制台应用程序中试验,或者应用程序本身是暂时性的(它已编写脚本或单元测试项目)。为支持这些方案, AspNetCore. DataProtection包包括 EphemeralDataProtectionProvider
类型。此类型提供 IDataProtectionProvider
的基本实现,其密钥存储库仅保存在内存中,而不会写出到任何后备存储。
EphemeralDataProtectionProvider
的每个实例都使用其自己的唯一主密钥。因此,如果 IDataProtector
的根 EphemeralDataProtectionProvider
生成受保护的负载,则该负载只能由根同一 EphemeralDataProtectionProvider
实例的等效 IDataProtector
(给定相同的用途链)进行保护。
下面的示例演示如何实例化 EphemeralDataProtectionProvider
并使用它来保护和取消保护数据。
using System;
using Microsoft.AspNetCore.DataProtection;
public class Program
{
public static void Main(string[] args)
{
const string purpose = "Ephemeral.App.v1";
// create an ephemeral provider and demonstrate that it can round-trip a payload
var provider = new EphemeralDataProtectionProvider();
var protector = provider.CreateProtector(purpose);
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}");
// if I create a new ephemeral provider, it won't be able to unprotect existing
// payloads, even if I specify the same purpose
provider = new EphemeralDataProtectionProvider();
protector = provider.CreateProtector(purpose);
unprotectedPayload = protector.Unprotect(protectedPayload); // THROWS
}
}
/*
* SAMPLE OUTPUT
*
* Enter input: Hello!
* Protect returned: CfDJ8AAAAAAAAAAAAAAAAAAAAA...uGoxWLjGKtm1SkNACQ
* Unprotect returned: Hello!
* << throws CryptographicException >>
*/