ASP.NET Core'de Veri Koruması için DI olmayan senaryolar

Gönderen Rick Anderson

ASP.NET Core Data Protection sistemi normalde bir hizmet kapsayıcısına eklenir ve bağımlılık ekleme (DI) yoluyla bağımlı bileşenler tarafından kullanılır. Ancak, özellikle sistemi mevcut bir uygulamaya aktarırken bunun mümkün olmadığı veya istendiği durumlar vardır.

Bu senaryoları desteklemek için Microsoft.AspNetCore.DataProtection.Extensions paketi, DataProtectionProviderDI'ye bağlı kalmadan Data Protection'ı kullanmanın basit bir yolunu sunan somut bir tür sağlar. türü DataProtectionProvider uygular IDataProtectionProvider. DataProtectionProvider Oluşturma yalnızca aşağıdaki kod örneğinde görüldüğü gibi sağlayıcının şifreleme anahtarlarının depolanması gereken yeri belirtmek için bir DirectoryInfo örnek sağlanmasını gerektirir:

using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;

public class Program
{
    public static void Main(string[] args)
    {
        // Get the path to %LOCALAPPDATA%\myapp-keys
        var destFolder = Path.Combine(
            System.Environment.GetEnvironmentVariable("LOCALAPPDATA"),
            "myapp-keys");

        // Instantiate the data protection system at this folder
        var dataProtectionProvider = DataProtectionProvider.Create(
            new DirectoryInfo(destFolder));

        var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
        Console.Write("Enter input: ");
        var input = Console.ReadLine();

        // Protect the payload
        var protectedPayload = protector.Protect(input);
        Console.WriteLine($"Protect returned: {protectedPayload}");

        // Unprotect the payload
        var unprotectedPayload = protector.Unprotect(protectedPayload);
        Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

        Console.WriteLine();
        Console.WriteLine("Press any key...");
        Console.ReadKey();
    }
}

/*
 * SAMPLE OUTPUT
 *
 * Enter input: Hello world!
 * Protect returned: CfDJ8FWbAn6...ch3hAPm1NJA
 * Unprotect returned: Hello world!
 *
 * Press any key...
*/

Varsayılan olarak, DataProtectionProvider somut tür ham anahtar malzemesini dosya sisteminde kalıcı hale gelmeden önce şifrelemez. Bu, geliştiricinin bir ağ paylaşımına işaret ettiği ve Veri Koruma sisteminin uygun bir anahtar şifreleme mekanizmasını otomatik olarak çıkarabildiği senaryolarırest desteklemektir.

Ayrıca somut tür varsayılan DataProtectionProvider olarak uygulamaları yalıtmaz. Aynı anahtar dizinini kullanan tüm uygulamalar, amaç parametreleri eşleşmiş olduğu sürece yükleri paylaşabilir.

Oluşturucu, DataProtectionProvider sistemin davranışlarını ayarlamak için kullanılabilecek isteğe bağlı bir yapılandırma geri çağırması kabul eder. Aşağıdaki örnekte, açık bir çağrısıyla yalıtımın geri yüklenmesi gösterilmektedir SetApplicationName. Örnek ayrıca, Windows DPAPI kullanarak kalıcı anahtarları otomatik olarak şifrelemek için sistemin yapılandırılmasını da gösterir. Dizin bir UNC paylaşımını işaret ederse, paylaşılan bir sertifikayı tüm ilgili makinelere dağıtmak ve sistemi çağrısıyla ProtectKeysWithCertificatesertifika tabanlı şifreleme kullanacak şekilde yapılandırmak isteyebilirsiniz.

using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;

public class Program
{
    public static void Main(string[] args)
    {
        // Get the path to %LOCALAPPDATA%\myapp-keys
        var destFolder = Path.Combine(
            System.Environment.GetEnvironmentVariable("LOCALAPPDATA"),
            "myapp-keys");

        // Instantiate the data protection system at this folder
        var dataProtectionProvider = DataProtectionProvider.Create(
            new DirectoryInfo(destFolder),
            configuration =>
            {
                configuration.SetApplicationName("my app name");
                configuration.ProtectKeysWithDpapi();
            });

        var protector = dataProtectionProvider.CreateProtector("Program.No-DI");
        Console.Write("Enter input: ");
        var input = Console.ReadLine();

        // Protect the payload
        var protectedPayload = protector.Protect(input);
        Console.WriteLine($"Protect returned: {protectedPayload}");

        // Unprotect the payload
        var unprotectedPayload = protector.Unprotect(protectedPayload);
        Console.WriteLine($"Unprotect returned: {unprotectedPayload}");

        Console.WriteLine();
        Console.WriteLine("Press any key...");
        Console.ReadKey();
    }
}

İpucu

Somut tür örnekleri DataProtectionProvider oluşturmak pahalıdır. Bir uygulama bu türdeki birden çok örneği barındırıyorsa ve hepsi aynı anahtar depolama dizinini kullanıyorsa, uygulama performansı düşebilir. Türünü kullanırsanız DataProtectionProvider , bu türü bir kez oluşturmanızı ve mümkün olduğunca yeniden kullanmanızı öneririz. Türü DataProtectionProvider ve ondan oluşturulan tüm IDataProtector örnekler, birden çok arayan için iş parçacığı açısından güvenlidir.