最简单的是保护数据,包括以下步骤:
从数据保护提供程序创建数据保护程序。
用要保护的数据调用 Protect
方法。
用要返回到纯文本的数据调用 Unprotect
方法。
大多数框架和应用模型(如 ASP.NET Core 或 SignalR)已配置数据保护系统,并将其添加到通过依赖关系注入访问的服务容器。 下面的示例演示如何为依赖关系注入配置服务容器并注册数据保护堆栈,通过 DI 接收数据保护提供程序,创建保护程序并保护然后取消保护数据。
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! */
创建保护程序时,必须提供一个或多个目的字符串。 用途字符串提供使用者之间的隔离。 例如,使用 "绿色" 目的字符串创建的保护程序将无法取消保护由 "紫色" 目的的保护程序提供的数据。
提示
IDataProtectionProvider
和 IDataProtector
的实例对于多个调用方是线程安全的。 它的目的是,在组件通过调用 CreateProtector
获取对 IDataProtector
的引用时,它会将该引用用于多次调用 Protect
和 Unprotect
。
如果无法验证或解密受保护的有效负载,则对 Unprotect
的调用将引发 System.security.cryptography.cryptographicexception。 某些组件可能希望在取消保护操作期间忽略错误;读取身份验证 cookie 的组件可能会处理此错误,并将请求视为根本没有 cookie,而不是完全失败的请求。 需要此行为的组件应专门捕获 System.security.cryptography.cryptographicexception,而不是抑制所有异常。