ASP.NET Core'de önemli depolama sağlayıcıları

Veri koruma sistemi, şifreleme anahtarlarının nerede kalıcı olması gerektiğini belirlemek için varsayılan olarak bir bulma mekanizması kullanır. Geliştirici varsayılan bulma mekanizmasını geçersiz kılabilir ve konumu el ile belirtebilir.

Uyarı

Açık bir anahtar kalıcılığı konumu belirtirsanız, veri koruma sistemi bekleme mekanizmasında varsayılan anahtar şifrelemesini kaydını serek anahtarların beklemede artık şifrelenmez. Üretim dağıtımları için ayrıca açık bir anahtar şifreleme mekanizması belirtmeniz önerilir.

Dosya sistemi

Dosya sistemi tabanlı bir anahtar deposunu yapılandırmak için aşağıda gösterildiği gibi PersistKeysToFileSystem yapılandırma yordamını arayın. Anahtarların depolandığı depoya işaret ediyor bir DirectoryInfo sağlama:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}

DirectoryInfo, yerel makinedeki bir dizine veya ağ paylaşımında bir klasöre işaret etmek için kullanılabilir. Yerel makinede bir dizine işaret ediyorsanız (ve senaryo yalnızca yerel makinede yer alan uygulamaların bu depoyu kullanmak için erişim gerektirmesi ise), anahtarları şifrelemek için Windows DPAPI (Windows üzerinde) kullanmayı göz önünde bulundurabilirsiniz. Aksi takdirde, kalan anahtarları şifrelemek için bir X.509 sertifikası kullanmayı göz önünde bulundurarak.

Azure Depolama

Azure.Extensions.AspNetCore.DataProtection.Blobs paketi, veri koruma anahtarlarının Azure Blob depolama alanında depolanmasına Depolama. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaştırılır. Uygulamalar, kimlik doğrulamasını cookie veya CSRF korumasını birden çok sunucu arasında paylaşabilir.

Azure Blob Depolama sağlayıcısını Depolama için PersistKeysToAzureBlobStorage aşırı yüklemelerinden birini arayın.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}

Web uygulaması bir Azure hizmeti olarak çalışıyorsa, Azure.Depolama kullanarak Azure depolamada kimlik doğrulaması yapmak için bağlantı dizesi kullanılabilir. Bloblar.

string connectionString = "<connection_string>";
string containerName = "my-key-container";
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);

// optional - provision the container automatically
await container.CreateIfNotExistsAsync();

services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(container, "keys.xml");

Not

Depolama hesabınıza bağlantı dizesi Azure Portal'da "Erişim Anahtarları" bölümü altında veya aşağıdaki CLI komutu çalıştırarak bulunabilir:

az storage account show-connection-string --name <account_name> --resource-group <resource_group>

Redis

Microsoft.AspNetCore.DataProtection.StackExchangeRedis paketi, veri koruma anahtarlarının bir Redis önbelleğinde depolanmasına olanak sağlar. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaştırılır. Uygulamalar, kimlik doğrulamasını cookie veya CSRF korumasını birden çok sunucu arasında paylaşabilir.

Microsoft.AspNetCore.DataProtection.Redis paketi, veri koruma anahtarlarının bir Redis önbelleğinde depolanmasına olanak sağlar. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaştırılır. Uygulamalar, kimlik doğrulamasını cookie veya CSRF korumasını birden çok sunucu arasında paylaşabilir.

Redis'de yapılandırmak için PersistKeysToStackExchangeRedis aşırı yüklemelerinden birini arayın:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}

Redis'de yapılandırmak için PersistKeysToRedis aşırı yüklemelerinden birini arayın:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToRedis(redis, "DataProtection-Keys");
}

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Kayıt Defteri

Yalnızca dağıtımlar Windows geçerlidir.

Bazen uygulamanın dosya sistemine yazma erişimi olabilir. Bir uygulamanın sanal hizmet hesabı olarak (örneğin, uygulama havuzu kimliği w3wp.exe) çalıştır olduğu bir senaryo düşünün. Bu durumlarda yönetici, hizmet hesabı kimliği tarafından erişilebilen bir kayıt defteri anahtarı sağlar. Aşağıda gösterildiği gibi PersistKeysToRegistry uzantısı yöntemini çağırma. Şifreleme anahtarlarının depolandığı konumu işaret etmek için bir RegistryKey sağlama:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}

Önemli

Diğer anahtarları Windows şifrelemek için DPAPI'nin kullanılması önerilir.

Entity Framework Core

Microsoft.AspNetCore.DataProtection.EntityFrameworkCore paketi, veri koruma anahtarlarını bir veritabanına depolamaya Entity Framework Core. NuGet paketi proje dosyasına eklenmiştir; bu, meta veri Microsoft.AspNetCore.DataProtection.EntityFrameworkCore paketinin Microsoft.AspNetCore.App değildir.

Bu paketle, anahtarlar bir web uygulamasının birden çok örneği arasında paylaştırılır.

Uygulama sağlayıcısını yapılandırmak EF Core PersistKeysToDbContext yöntemini <TContext> arayın:

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);
}

Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.

genel parametresi TContext DbContext'den devralmalı ve IDataProtectionKeyContext'i uygulamalı:

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; }
    }
}

Tabloyu DataProtectionKeys oluşturun.

Paket Yöneticisi Console (PMC) penceresinde aşağıdaki komutları yürütün:

Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext

MyKeysContext , DbContext önceki kod örneğinde tanımlanan değeridir. Farklı bir adla DbContext kullanıyorsanız yerine adını DbContext MyKeysContext yazın.

DataProtectionKeyssınıf/varlık, aşağıdaki tabloda gösterilen yapıyı benimser.

Özellik/Alan CLR Türü SQL Türü
Id int int, PK, IDENTITY(1,1) , null değil
FriendlyName string nvarchar(MAX)Null
Xml string nvarchar(MAX)Null

Özel anahtar deposu

Kutu mekanizmaları uygunsa, geliştirici özel bir IXmlRepositorysağlayarak kendi anahtar kalıcılığı mekanizmasını belirtebilir.