- 通用
- 身份验证
- 授权
- 数据保护
- 机密管理
有关 ASP.NET Core 的使用者 Api 概述
IDataProtectionProvider
和IDataProtector
接口是通过该使用者使用数据保护系统的基本接口。 它们位于Microsoft.AspNetCore.DataProtection.Abstractions包。
IDataProtectionProvider
提供程序接口表示的数据保护系统的根目录。 它不能直接用于保护或取消保护数据。 相反,使用者必须获得对的引用IDataProtector
通过调用IDataProtectionProvider.CreateProtector(purpose)
,其中,目的是描述预期使用者用例的字符串。 请参阅目标字符串着眼于此参数以及如何选择适当的值的更详细信息。
IDataProtector
保护程序接口将返回通过调用CreateProtector
,和它的使用者可以使用来执行此界面保护和取消保护操作。
若要保护的数据片段,将数据传递到Protect
方法。 基本接口定义的转换为 byte []-> byte [] 的方法,但没有还将字符串转换的重载 (作为扩展方法提供)-> 字符串。 提供两种方法的安全性是完全相同;开发人员应选择任何重载是最方便的其用例。 而不考虑选择,重载保护返回的值方法现在受到保护 (加密和防篡改的),并在应用程序可以将其发送到不受信任的客户端。
若要取消对以前受保护的一段数据的保护,将传递到受保护的数据Unprotect
方法。 (有 byte []-基于和基于字符串的重载,为开发人员方便起见。)如果受保护的有效负载生成到的早期调用,则Protect
此同一IDataProtector
,则Unprotect
方法将返回原始的未受保护的负载。 如果受保护的有效负载已被篡改或生成由不同IDataProtector
,则Unprotect
方法将引发 CryptographicException。
与不同的相同概念IDataProtector
ties 回用途的概念。 如果两个IDataProtector
从同一个根生成实例IDataProtectionProvider
通过不同的用途对的调用中的字符串,但IDataProtectionProvider.CreateProtector
,则它们被视为不同的保护程序,和一个将无法取消保护生成由其他有效负载。
使用这些接口
有关组件的 DI 感知,预期使用情况是该组件将IDataProtectionProvider
其构造函数中的参数和实例化组件时,DI 系统可以自动提供此服务。
备注
某些应用程序 (例如控制台应用程序或 ASP.NET 4.x 应用程序) 可能不是 DI 感知因此不能使用此处描述的机制。 有关这些方案,请参阅非 DI 感知方案获取的实例的详细信息的文档IDataProtection
而无需通过 DI 提供程序。
下面的示例演示了三个概念:
添加数据保护系统到服务容器
使用 DI 来接收实例
IDataProtectionProvider
,和创建
IDataProtector
从IDataProtectionProvider
并使用它来保护和取消保护数据。
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! */
包 Microsoft.AspNetCore.DataProtection.Abstractions 包含扩展方法IServiceProvider.GetDataProtector
为开发人员方便起见。 它作为单个操作封装这两个检索IDataProtectionProvider
从服务提供商和调用IDataProtectionProvider.CreateProtector
。 下面的示例演示其用法。
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(); // get an IDataProtector from the IServiceProvider var protector = services.GetDataProtector("Contoso.Example.v2"); 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}"); } }
提示
实例IDataProtectionProvider
和IDataProtector
是线程安全的多个调用方。 它可用于的一个组件,获取对的引用后IDataProtector
通过调用CreateProtector
,它将该引用用于对多个调用Protect
和Unprotect
。 调用Unprotect
将引发 CryptographicException,如果受保护的有效负载不能验证或中译解出来。 某些组件可能想要忽略错误期间取消保护操作;一个组件,它读取身份验证 cookie 可能处理此错误,并将请求视为如同它在所有具有任何 cookie 而无法完全是请求。 需要此行为的组件应专门捕获 CryptographicException,而不是抑制所有异常。