有关 ASP.NET Core 的使用者 Api 概述

IDataProtectionProviderIDataProtector接口是通过该使用者使用数据保护系统的基本接口。 它们位于Microsoft.AspNetCore.DataProtection.Abstractions包。

IDataProtectionProvider

提供程序接口表示的数据保护系统的根目录。 它不能直接用于保护或取消保护数据。 相反,使用者必须获得对的引用IDataProtector通过调用IDataProtectionProvider.CreateProtector(purpose),其中,目的是描述预期使用者用例的字符串。 请参阅目标字符串着眼于此参数以及如何选择适当的值的更详细信息。

IDataProtector

保护程序接口将返回通过调用CreateProtector,和它的使用者可以使用来执行此界面保护和取消保护操作。

若要保护的数据片段,将数据传递到Protect方法。 基本接口定义的转换为 byte []-> byte [] 的方法,但没有还将字符串转换的重载 (作为扩展方法提供)-> 字符串。 提供两种方法的安全性是完全相同;开发人员应选择任何重载是最方便的其用例。 而不考虑选择,重载保护返回的值方法现在受到保护 (加密和防篡改的),并在应用程序可以将其发送到不受信任的客户端。

若要取消对以前受保护的一段数据的保护,将传递到受保护的数据Unprotect方法。 (有 byte []-基于和基于字符串的重载,为开发人员方便起见。)如果受保护的有效负载生成到的早期调用,则Protect此同一IDataProtector,则Unprotect方法将返回原始的未受保护的负载。 如果受保护的有效负载已被篡改或生成由不同IDataProtector,则Unprotect方法将引发 CryptographicException。

与不同的相同概念IDataProtectorties 回用途的概念。 如果两个IDataProtector从同一个根生成实例IDataProtectionProvider通过不同的用途对的调用中的字符串,但IDataProtectionProvider.CreateProtector,则它们被视为不同的保护程序,和一个将无法取消保护生成由其他有效负载。

使用这些接口

有关组件的 DI 感知,预期使用情况是该组件将IDataProtectionProvider其构造函数中的参数和实例化组件时,DI 系统可以自动提供此服务。

备注

某些应用程序 (例如控制台应用程序或 ASP.NET 4.x 应用程序) 可能不是 DI 感知因此不能使用此处描述的机制。 有关这些方案,请参阅非 DI 感知方案获取的实例的详细信息的文档IDataProtection而无需通过 DI 提供程序。

下面的示例演示了三个概念:

  1. 添加数据保护系统到服务容器

  2. 使用 DI 来接收实例IDataProtectionProvider,和

  3. 创建IDataProtectorIDataProtectionProvider并使用它来保护和取消保护数据。

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}");
    }
}

提示

实例IDataProtectionProviderIDataProtector是线程安全的多个调用方。 它可用于的一个组件,获取对的引用后IDataProtector通过调用CreateProtector,它将该引用用于对多个调用ProtectUnprotect 调用Unprotect将引发 CryptographicException,如果受保护的有效负载不能验证或中译解出来。 某些组件可能想要忽略错误期间取消保护操作;一个组件,它读取身份验证 cookie 可能处理此错误,并将请求视为如同它在所有具有任何 cookie 而无法完全是请求。 需要此行为的组件应专门捕获 CryptographicException,而不是抑制所有异常。

上一篇:ASP.NET Core 中的数据保护 Api 入门

下一篇:在 ASP.NET Core 目的字符串

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程