Penyedia penyimpanan utama di ASP.NET Core
Sistem perlindungan data menggunakan mekanisme penemuan secara default untuk menentukan di mana kunci kriptografi harus dipertahankan. Pengembang dapat mengambil alih mekanisme penemuan default dan menentukan lokasi secara manual.
Peringatan
Jika Anda menentukan lokasi persistensi kunci eksplisit, sistem perlindungan data membatalkan pendaftaran enkripsi kunci default pada mekanisme, sehingga kunci tidak lagi dienkripsi rest di rest. Disarankan agar Anda juga menentukan mekanisme enkripsi kunci eksplisit untuk penyebaran produksi.
Sistem file
Untuk mengonfigurasi repositori kunci berbasis sistem file, panggil rutinitas konfigurasi seperti yang PersistKeysToFileSystem ditunjukkan di bawah ini. DirectoryInfo Berikan penunjuk ke repositori tempat kunci harus disimpan:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
DirectoryInfo
dapat menunjuk ke direktori pada komputer lokal, atau dapat menunjuk ke folder pada berbagi jaringan. Jika menunjuk ke direktori pada komputer lokal (dan skenarionya adalah bahwa hanya aplikasi di komputer lokal yang memerlukan akses untuk menggunakan repositori ini), pertimbangkan untuk menggunakan Windows DPAPI (di Windows) untuk mengenkripsi kunci di rest. Jika tidak, pertimbangkan untuk menggunakan sertifikat X.509 untuk mengenkripsi kunci di rest.
Azure Storage
Paket Azure.Extensions.AspNetCore.DataProtection.Blobs memungkinkan penyimpanan kunci perlindungan data di Azure Blob Storage. Kunci dapat dibagikan di beberapa instans aplikasi web. Aplikasi dapat berbagi cookie autentikasi atau perlindungan CSRF di beberapa server.
Untuk mengonfigurasi penyedia Azure Blob Storage, panggil salah PersistKeysToAzureBlobStorage satu kelebihan beban.
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}
Jika aplikasi web berjalan sebagai layanan Azure, string koneksi dapat digunakan untuk mengautentikasi ke penyimpanan Azure dengan menggunakan Azure.Storage.Blobs.
Peringatan
Artikel ini memperlihatkan penggunaan string koneksi. Dengan database lokal, pengguna tidak perlu diautentikasi, tetapi dalam produksi, string koneksi terkadang menyertakan kata sandi untuk mengautentikasi. Kredensial kata sandi pemilik sumber daya (ROPC) adalah risiko keamanan yang harus dihindari dalam database produksi. Aplikasi produksi harus menggunakan alur autentikasi paling aman yang tersedia. Untuk informasi selengkapnya tentang autentikasi untuk aplikasi yang disebarkan untuk menguji atau lingkungan produksi, lihat Mengamankan alur autentikasi.
string connectionString = "<connection_string>";
string containerName = "my-key-container";
string blobName = "keys.xml";
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);
// optional - provision the container automatically
await container.CreateIfNotExistsAsync();
BlobClient blobClient = container.GetBlobClient(blobName);
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(blobClient);
Catatan
string koneksi ke akun penyimpanan Anda dapat ditemukan di Portal Microsoft Azure di bagian "Kunci Akses" atau dengan menjalankan perintah CLI berikut:
az storage account show-connection-string --name <account_name> --resource-group <resource_group>
Redis
Paket Microsoft.AspNetCore.DataProtection.StackExchangeRedis memungkinkan penyimpanan kunci perlindungan data dalam cache Redis. Kunci dapat dibagikan di beberapa instans aplikasi web. Aplikasi dapat berbagi cookie autentikasi atau perlindungan CSRF di beberapa server.
Paket Microsoft.AspNetCore.DataProtection.Redis memungkinkan penyimpanan kunci perlindungan data dalam cache Redis. Kunci dapat dibagikan di beberapa instans aplikasi web. Aplikasi dapat berbagi cookie autentikasi atau perlindungan CSRF di beberapa server.
Untuk mengonfigurasi di Redis, panggil salah PersistKeysToStackExchangeRedis satu kelebihan beban:
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
Untuk mengonfigurasi di Redis, panggil salah PersistKeysToRedis satu kelebihan beban:
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToRedis(redis, "DataProtection-Keys");
}
Untuk mengetahui informasi selengkapnya, lihat topik berikut:
Registri
Hanya berlaku untuk penyebaran Windows.
Terkadang aplikasi mungkin tidak memiliki akses tulis ke sistem file. Pertimbangkan skenario di mana aplikasi berjalan sebagai akun layanan virtual (seperti kumpulan aplikasi identityw3wp.exe ). Dalam kasus ini, administrator dapat menyediakan kunci registri yang dapat diakses oleh akun identitylayanan . Panggil metode ekstensi seperti yang PersistKeysToRegistry ditunjukkan di bawah ini. RegistryKey Berikan penunjuk ke lokasi tempat kunci kriptografi harus disimpan:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Penting
Sebaiknya gunakan Windows DPAPI untuk mengenkripsi kunci di rest.
Entity Framework Core
Paket Microsoft.AspNetCore.DataProtection.EntityFrameworkCore menyediakan mekanisme untuk menyimpan kunci perlindungan data ke database menggunakan Entity Framework Core. Paket Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
NuGet harus ditambahkan ke file proyek, itu bukan bagian dari metapackage Microsoft.AspNetCore.App.
Dengan paket ini, kunci dapat dibagikan di beberapa instans aplikasi web.
Untuk mengonfigurasi EF Core penyedia, panggil PersistKeysToDbContext metode :
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// Add a DbContext to store your Database Keys
services.AddDbContext<MyKeysContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MyKeysConnection")));
// using Microsoft.AspNetCore.DataProtection;
services.AddDataProtection()
.PersistKeysToDbContext<MyKeysContext>();
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Jika Anda ingin melihat komentar kode yang diterjemahkan ke bahasa selain bahasa Inggris, beri tahu kami dalam masalah diskusi GitHub ini.
Parameter generik, TContext
, harus mewarisi dari DbContext dan mengimplementasikan IDataProtectionKeyContext:
using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
namespace WebApp1
{
class MyKeysContext : DbContext, IDataProtectionKeyContext
{
// A recommended constructor overload when using EF Core
// with dependency injection.
public MyKeysContext(DbContextOptions<MyKeysContext> options)
: base(options) { }
// This maps to the table that stores keys.
public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
}
}
DataProtectionKeys
Buat tabel.
Jalankan perintah berikut di jendela Package Manager Console (PMC):
Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext
MyKeysContext
adalah yang DbContext
ditentukan dalam sampel kode sebelumnya. Jika Anda menggunakan dengan nama yang DbContext
berbeda, ganti nama Anda DbContext
untuk MyKeysContext
.
Kelas DataProtectionKeys
/entitas mengadopsi struktur yang ditunjukkan dalam tabel berikut.
Properti/Bidang | Jenis CLR | Jenis SQL |
---|---|---|
Id |
int |
int , PK, IDENTITY(1,1) , bukan null |
FriendlyName |
string |
nvarchar(MAX) nol |
Xml |
string |
nvarchar(MAX) nol |
Repositori kunci kustom
Jika mekanisme dalam kotak tidak sesuai, pengembang dapat menentukan mekanisme persistensi kunci mereka sendiri dengan menyediakan kustom IXmlRepository.
ASP.NET Core