限制在 ASP.NET Core 的受保护负载的生存期

提供了应用程序开发人员希望创建将在一段时间后过期的受保护的负载的方案。 例如,受保护的有效负载可能表示应仅在有效一小时内的密码重置令牌。 当然可以供开发人员创建他们自己有效负载格式,它包含嵌入的到期日期,和高级开发人员可能想要执行此操作,但对于大多数开发人员管理这些过期时间可能变得枯燥乏味。

若要简化此过程对于我们的开发人员受众,该包Microsoft.AspNetCore.DataProtection.Extensions实用工具 Api 包含用于创建在一段时间后自动过期的有效负载。 这些 Api 的挂起的中断ITimeLimitedDataProtector类型。

API 使用情况

ITimeLimitedDataProtector接口是用于保护和取消保护的限时 / 自即将到期的有效负载的核心接口。 若要创建的实例ITimeLimitedDataProtector,首先需要的正则表达式实例IDataProtector构造有特定的用途。 一次IDataProtector实例是否可用,请调用IDataProtector.ToTimeLimitedDataProtector扩展方法,以使用内置过期功能得到保护程序。

ITimeLimitedDataProtector 公开了以下 API 图面和扩展方法:

  • CreateProtector (字符串用途):ITimeLimitedDataProtector-此 API 是类似于现有IDataProtectionProvider.CreateProtector在于它可用于创建用途链从根的限时保护程序。

  • Protect(byte[] plaintext, DateTimeOffset expiration) : byte[]

  • Protect(byte[] plaintext, TimeSpan lifetime) : byte[]

  • Protect(byte[] plaintext) : byte[]

  • 保护 (字符串纯文本,DateTimeOffset 过期): 字符串

  • 保护 (纯文本字符串,时间跨度生存期): 字符串

  • 保护 (纯文本字符串): 字符串

除了核心Protect这需要仅纯文本,方法有新重载允许指定有效负载的到期日期。 到期日期可以指定为绝对日期 (通过DateTimeOffset) 或相对时间 (从当前系统时间,通过TimeSpan)。 如果调用不会过期时间的重载,则假定负载永远不会为过期。

  • Unprotect(byte[] protectedData, out DateTimeOffset expiration) : byte[]

  • Unprotect(byte[] protectedData) : byte[]

  • 取消保护 (DateTimeOffset 过期出字符串 protectedData): 字符串

  • 取消保护 (字符串 protectedData): 字符串

Unprotect方法返回原始的未受保护的数据。 如果尚未超过有效负载,绝对到期则返回作为可选输出参数以及原始的未受保护数据。 如果有效负载已过期,Unprotect 方法的所有重载将都引发 CryptographicException。

警告

不建议使用这些 Api 来保护需要永久保留长期或无限期的负载。 "我能否在一个月后为永久性不可恢复的受保护负载的?" 可作为一个良好经验;如果答案是没有然后开发人员应考虑备用 Api。

下面的示例使用非 DI 代码路径用于实例化的数据保护系统。 若要运行此示例,请确保首先添加对 Microsoft.AspNetCore.DataProtection.Extensions 包的引用。

using System;
using System.IO;
using System.Threading;
using Microsoft.AspNetCore.DataProtection;
 
public class Program
{
    public static void Main(string[] args)
    {
        // create a protector for my application
 
        var provider = DataProtectionProvider.Create(new DirectoryInfo(@"c:\myapp-keys\"));
        var baseProtector = provider.CreateProtector("Contoso.TimeLimitedSample");
 
        // convert the normal protector into a time-limited protector
        var timeLimitedProtector = baseProtector.ToTimeLimitedDataProtector();
 
        // get some input and protect it for five seconds
        Console.Write("Enter input: ");
        string input = Console.ReadLine();
        string protectedData = timeLimitedProtector.Protect(input, lifetime: TimeSpan.FromSeconds(5));
        Console.WriteLine($"Protected data: {protectedData}");
 
        // unprotect it to demonstrate that round-tripping works properly
        string roundtripped = timeLimitedProtector.Unprotect(protectedData);
        Console.WriteLine($"Round-tripped data: {roundtripped}");
 
        // wait 6 seconds and perform another unprotect, demonstrating that the payload self-expires
        Console.WriteLine("Waiting 6 seconds...");
        Thread.Sleep(6000);
        timeLimitedProtector.Unprotect(protectedData);
    }
}
 
/*
 * SAMPLE OUTPUT
 *
 * Enter input: Hello!
 * Protected data: CfDJ8Hu5z0zwxn...nLk7Ok
 * Round-tripped data: Hello!
 * Waiting 6 seconds...
 * <<throws CryptographicException with message 'The payload expired at ...'>>

 */

上一篇:在 ASP.NET Core中的哈希密码

下一篇:取消保护已吊销在 ASP.NET Core 中键的有效负载

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

扫描二维码
程序员编程王

扫一扫关注最新编程教程