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

Veri koruma sistemi , şifreleme anahtarlarının kalıcı olması gereken yeri 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 belirtirseniz, veri koruma sistemi varsayılan anahtar şifrelemesinin kaydını mekanizmada rest kaldırdığından anahtarlar artık adresinde restşifrelenmez. Ayrıca üretim dağıtımları için açık bir anahtar şifreleme mekanizması belirtmeniz önerilir.

Dosya sistemi

Dosya sistemi tabanlı anahtar deposunu yapılandırmak için aşağıda gösterildiği gibi yapılandırma yordamını PersistKeysToFileSystem çağırın. Anahtarların depolanması gereken depoya işaret eden bir DirectoryInfo bilgi sağlayın:

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

DirectoryInfo yerel makinedeki bir dizini veya ağ paylaşımındaki bir klasörü işaret edebilir. Yerel makinedeki bir dizine işaret ediyorsanız (ve senaryo, yalnızca yerel makinedeki uygulamaların bu depoyu kullanmak için erişim gerektirmesiyse), konumundaki restanahtarları şifrelemek için Windows DPAPI (Windows üzerinde) kullanmayı göz önünde bulundurun. Aksi takdirde, konumundaki restanahtarları şifrelemek için bir X.509 sertifikası kullanmayı göz önünde bulundurun.

Azure Depolama

Azure.Extensions.AspNetCore.DataProtection.Blobs paketi, veri koruma anahtarlarının Azure Blob Depolama depolanmasına olanak tanır. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaşılabilir. Uygulamalar kimlik doğrulama tanımlama bilgilerini veya CSRF korumasını birden çok sunucuda paylaşabilir.

Azure Blob Depolama sağlayıcısını yapılandırmak için aşırı yüklemelerden birini çağırınPersistKeysToAzureBlobStorage.

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

Web uygulaması bir Azure hizmeti olarak çalışıyorsa bağlantı dizesi Azure.Storage.Blobs kullanılarak Azure depolamada kimlik doğrulaması yapmak için kullanılabilir.

Uyarı

Bu makalede bağlantı dizesi kullanımı gösterilmektedir. Yerel bir veritabanıyla kullanıcının kimliğinin doğrulanması gerekmez, ancak üretimde bağlantı dizesi bazen kimlik doğrulaması için bir parola içerir. Kaynak sahibi parola kimlik bilgileri (ROPC), üretim veritabanlarında kaçınılması gereken bir güvenlik riskidir. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Test veya üretim ortamlarına dağıtılan uygulamalar için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

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

Not

Depolama hesabınıza bağlantı dizesi Azure Portal'da "Erişim Anahtarları" bölümünde veya aşağıdaki CLI komutunu ç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 Redis önbelleğinde depolanmasına olanak tanır. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaşılabilir. Uygulamalar kimlik doğrulama tanımlama bilgilerini veya CSRF korumasını birden çok sunucuda paylaşabilir.

Microsoft.AspNetCore.DataProtection.Redis paketi, veri koruma anahtarlarının Redis önbelleğinde depolanmasına olanak tanır. Anahtarlar bir web uygulamasının çeşitli örnekleri arasında paylaşılabilir. Uygulamalar kimlik doğrulama tanımlama bilgilerini veya CSRF korumasını birden çok sunucuda paylaşabilir.

Redis'te yapılandırmak için aşırı yüklemelerden birini çağırın PersistKeysToStackExchangeRedis :

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

Redis'te yapılandırmak için aşırı yüklemelerden birini çağırın PersistKeysToRedis :

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 Windows dağıtımları için geçerlidir.

Bazen uygulamanın dosya sistemine yazma erişimi olmayabilir. Bir uygulamanın sanal hizmet hesabı (w3wp.exe uygulama havuzu identitygibi) olarak çalıştığı bir senaryo düşünün. Bu gibi durumlarda, yönetici hizmet hesabı identitytarafından erişilebilen bir kayıt defteri anahtarı sağlayabilir. PersistKeysToRegistry Aşağıda gösterildiği gibi uzantı yöntemini çağırın. Şifreleme anahtarlarının depolanması gereken konumu gösteren bir RegistryKey belirtin:

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

Önemli

konumundaki restanahtarları şifrelemek için Windows DPAPI kullanmanızı öneririz.

Entity Framework Core

Microsoft.AspNetCore.DataProtection.EntityFrameworkCore paketi, Entity Framework Core kullanarak veritabanına veri koruma anahtarlarını depolamak için bir mekanizma sağlar. Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet paketi proje dosyasına eklenmelidir, Microsoft.AspNetCore.App meta paketinin bir parçası değildir.

Bu paketle, anahtarlar bir web uygulamasının birden çok örneğinde paylaşılabilir.

Sağlayıcıyı EF Core yapılandırmak için yöntemini çağırın PersistKeysToDbContext :

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

Kod açıklamalarının İngilizce dışındaki dillere çevirisini görmek isterseniz, bunu bu GitHub tartışma konusunda bize bildirin.

genel parametresinin TContextöğesinden DbContext devralması ve uygulaması IDataProtectionKeyContextgerekir:

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 Tabloyu oluşturun.

Paket Yöneticisi Konsolu (PMC) penceresinde aşağıdaki komutları yürütebilirsiniz:

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

MyKeysContextDbContext, önceki kod örneğinde tanımlanandır. Farklı bir ada sahip bir DbContext kullanıyorsanız, yerine adınızı DbContext MyKeysContextyazın.

DataProtectionKeys sı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)sıfır
Xml string nvarchar(MAX)sıfır

Özel anahtar deposu

Yerleşik mekanizmalar uygun değilse, geliştirici özel IXmlRepositorybir sağlayarak kendi anahtar kalıcılık mekanizmasını belirtebilir.