ASP.NET Core의 임시 데이터 보호 공급자

애플리케이션에 일회용 IDataProtectionProvider가 필요한 시나리오가 있습니다. 예를 들어 개발자가 일회성 콘솔 애플리케이션에서 실험 중이거나 애플리케이션 자체가 일시적(스크립팅 또는 단위 테스트 프로젝트임)일 수 있습니다. 이러한 시나리오를 지원하기 위해 Microsoft.AspNetCore.DataProtection 패키지에는 EphemeralDataProtectionProvider 형식이 포함됩니다. 이 형식은 키 리포지토리가 메모리에만 저장되고 백업 저장소에 기록되지 않는 IDataProtectionProvider의 기본 구현을 제공합니다.

각 인스턴스는 EphemeralDataProtectionProvider 고유한 기본 키를 사용합니다. 따라서 EphemeralDataProtectionProvider에 루팅된 IDataProtector가 보호된 페이로드를 생성하는 경우 해당 페이로드는 동일한 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 >>
*/