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
MyKeysContext
DbContext
, önceki kod örneğinde tanımlanandır. Farklı bir ada sahip bir DbContext
kullanıyorsanız, yerine adınızı DbContext
MyKeysContext
yazı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.
ASP.NET Core