Bagikan melalui


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 saat tidak aktif, sehingga kunci tidak lagi dienkripsi saat tidak aktif. 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 tidak aktif. Jika tidak, pertimbangkan untuk menggunakan sertifikat X.509 untuk mengenkripsi kunci saat tidak aktif.

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 perlindungan autentikasi cookieatau 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.

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 perlindungan autentikasi cookieatau 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 perlindungan autentikasi cookieatau 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 identitas kumpulan aplikasi w3wp.exe). Dalam kasus ini, administrator dapat menyediakan kunci registri yang dapat diakses oleh identitas akun layanan. 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 saat tidak aktif.

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)Null
Xml string nvarchar(MAX)Null

Repositori kunci kustom

Jika mekanisme dalam kotak tidak sesuai, pengembang dapat menentukan mekanisme persistensi kunci mereka sendiri dengan menyediakan kustom IXmlRepository.