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);
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ğ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ı (w3wp.exe uygulama havuzu kimliği gibi) olarak çalıştığı bir senaryo düşünün. 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
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) 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.
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin