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 bekleme sırasında varsayılan anahtar şifrelemesinin kaydını silip bekleyen anahtarlar artık ş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), bekleyen anahtarları şifrelemek için Windows DPAPI (Windows üzerinde) kullanmayı göz önünde bulundurun. Aksi takdirde bekleyen anahtarları ş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ğrulamalarını cookieveya 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, 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";
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);

Dekont

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ğrulamalarını cookieveya 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ğrulamalarını cookieveya 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ı olarak çalıştığı bir senaryo düşünün (örneğin , w3wp.exe'nin uygulama havuzu kimliği). Bu gibi durumlarda yönetici, hizmet hesabı kimliği tarafı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

Bekleyen anahtarları ş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ı DbContextMyKeysContextyazı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)Null
Xml string nvarchar(MAX)Null

Özel anahtar deposu

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