Skenario non-DI yang diketahui untuk Perlindungan Data di ASP.NET Core
Oleh Rick Anderson
Sistem ASP.NET Core Data Protection biasanya ditambahkan ke kontainer layanan dan digunakan oleh komponen dependen melalui injeksi dependensi (DI). Namun, ada kasus di mana ini tidak layak atau diinginkan, terutama saat mengimpor sistem ke aplikasi yang ada.
Untuk mendukung skenario ini, paket Microsoft.AspNetCore.DataProtection.Extensions menyediakan jenis konkret, DataProtectionProvider, yang menawarkan cara sederhana untuk menggunakan Perlindungan Data tanpa mengandalkan DI. Jenis mengimplementasikan DataProtectionProvider
IDataProtectionProvider. Membuat DataProtectionProvider
hanya mengharuskan DirectoryInfo menyediakan instans untuk menunjukkan di mana kunci kriptografi penyedia harus disimpan, seperti yang terlihat dalam sampel kode berikut:
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...
*/
Secara default, DataProtectionProvider
jenis beton tidak mengenkripsi bahan kunci mentah sebelum mempertahankannya ke sistem file. Ini untuk mendukung skenario di mana pengembang menunjuk ke berbagi jaringan dan sistem Perlindungan Data tidak dapat secara otomatis menyimpulkan mekanisme enkripsi kunci yangrest sesuai.
Selain itu, DataProtectionProvider
jenis beton tidak mengisolasi aplikasi secara default. Semua aplikasi yang menggunakan direktori kunci yang sama dapat berbagi payload selama parameter tujuannya cocok.
DataProtectionProvider Konstruktor menerima panggilan balik konfigurasi opsional yang dapat digunakan untuk menyesuaikan perilaku sistem. Sampel di bawah ini menunjukkan pemulihan isolasi dengan panggilan eksplisit ke SetApplicationName. Sampel ini juga menunjukkan konfigurasi sistem untuk mengenkripsi kunci yang bertahan secara otomatis menggunakan Windows DPAPI. Jika direktori menunjuk ke berbagi UNC, Anda mungkin ingin mendistribusikan sertifikat bersama di semua komputer yang relevan dan untuk mengonfigurasi sistem untuk menggunakan enkripsi berbasis sertifikat dengan panggilan ke ProtectKeysWithCertificate.
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();
}
}
Tip
Instans jenis DataProtectionProvider
beton mahal untuk dibuat. Jika aplikasi mempertahankan beberapa instans jenis ini dan jika semuanya menggunakan direktori penyimpanan kunci yang sama, performa aplikasi mungkin menur Jika Anda menggunakan jenisnya DataProtectionProvider
, kami sarankan Anda membuat jenis ini sekali dan menggunakannya kembali sebanyak mungkin. Jenis DataProtectionProvider
dan semua IDataProtector instans yang dibuat darinya aman untuk beberapa penelepon.
ASP.NET Core