Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Система защиты данных использует механизм обнаружения по умолчанию , чтобы определить, где должны храниться криптографические ключи. Разработчик может переопределить механизм обнаружения по умолчанию и вручную указать расположение.
Предупреждение
Если указать явное расположение хранения ключей, система защиты данных отменяет использование шифрования ключей по умолчанию для хранения, и ключи больше не шифруются в состоянии покоя. Рекомендуется дополнительно указать явный механизм шифрования ключей для рабочих развертываний.
Файловая система
Чтобы настроить репозиторий ключей на основе файловой системы, вызовите подпрограмму PersistKeysToFileSystem конфигурации, как показано ниже. Укажите указатель на репозиторий DirectoryInfo , в котором должны храниться ключи:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
Можно DirectoryInfo
указать каталог на локальном компьютере или указать папку на сетевом ресурсе. Если рассматривать указание на каталог на локальном компьютере (и сценарий заключается в том, что только приложения на локальном компьютере требуют доступа к этому репозиторию), подумайте о использовании Windows DPAPI (в Windows) для шифрования ключей в состоянии покоя. В противном случае, рассмотрите возможность использования сертификата X.509 для шифрования ключей в состоянии покоя.
Хранилище Azure
Пакет Azure.Extensions.AspNetCore.DataProtection.Blobs позволяет хранить ключи защиты данных в Хранилище BLOB-объектов Azure. Ключи можно совместно использовать в нескольких экземплярах веб-приложения. Приложения могут совместно использовать файлы cookie проверки подлинности или защиту CSRF на нескольких серверах.
Чтобы настроить поставщика Azure Blob Storage, вызовите одну из PersistKeysToAzureBlobStorage перегрузок.
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}
Если веб-приложение работает в качестве службы Azure, строку подключения можно использовать для аутентификации в службе хранилища Azure с помощью Azure.Storage.Blobs.
Предупреждение
В этой статье показано использование строк подключения. С локальной базой данных пользователю не требуется аутентификация, но в рабочей среде в строку подключения иногда включается пароль для аутентификации. Учетные данные владельца ресурса (ROPC) — это риск безопасности, который следует избежать в рабочих базах данных. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в разделе "Безопасные потоки проверки подлинности".
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);
Примечание.
Строку подключения к вашей учетной записи хранения можно найти на портале Azure в разделе "Ключи доступа" или с помощью выполнения следующей команды CLI.
az storage account show-connection-string --name <account_name> --resource-group <resource_group>
Redis
Пакет Microsoft.AspNetCore.DataProtection.StackExchangeRedis позволяет хранить ключи защиты данных в кэше Redis. Ключи можно совместно использовать в нескольких экземплярах веб-приложения. Приложения могут совместно использовать файлы cookie проверки подлинности или защиту CSRF на нескольких серверах.
Пакет Microsoft.AspNetCore.DataProtection.Redis позволяет хранить ключи защиты данных в кэше Redis. Ключи можно совместно использовать в нескольких экземплярах веб-приложения. Приложения могут совместно использовать файлы cookie проверки подлинности или защиту CSRF на нескольких серверах.
Чтобы настроить Redis, вызовите одну из PersistKeysToStackExchangeRedis перегрузок:
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
Чтобы настроить Redis, вызовите одну из PersistKeysToRedis перегрузок.
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToRedis(redis, "DataProtection-Keys");
}
Дополнительные сведения см. в следующих разделах:
Реестр
Применяется только к развертываниям Windows.
Иногда приложение может не иметь доступа на запись к файловой системе. Рассмотрим сценарий, в котором приложение работает под учетной записью виртуальной службы (например, под идентификатором пула приложений w3wp.exe). В таких случаях администратор может предоставить раздел реестра, к которому может обращаться удостоверение учетной записи службы. PersistKeysToRegistry Вызовите метод расширения, как показано ниже. RegistryKey Укажите расположение, в котором должны храниться криптографические ключи:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Платформа Entity Framework Core
Пакет Microsoft.AspNetCore.DataProtection.EntityFrameworkCore предоставляет механизм хранения ключей защиты данных в базе данных с помощью Entity Framework Core. Пакет Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
NuGet должен быть добавлен в файл проекта, он не является частью метапакета Microsoft.AspNetCore.App.
С помощью этого пакета ключи можно совместно использовать для нескольких экземпляров веб-приложения.
Чтобы настроить EF Core поставщика, вызовите 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);
}
Если вы хотите увидеть комментарии к коду, переведенные на языки, отличные от английского, сообщите нам на странице обсуждения этой проблемы на сайте GitHub.
Универсальный параметр TContext
должен наследоваться от DbContext и реализовать IDataProtectionKeyContext:
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
таблицу.
Выполните следующие команды в окне консоли диспетчер пакетов (PMC):
Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext
MyKeysContext
является DbContext
, определяемым в предыдущем примере кода. Если вы используете DbContext
с другим именем, замените ваше имя DbContext
на MyKeysContext
.
Класс DataProtectionKeys
или сущность принимает структуру, показанную в следующей таблице.
Свойство/поле | Тип CLR | Тип SQL |
---|---|---|
Id |
int |
int , PK, IDENTITY(1,1) не null |
FriendlyName |
string |
nvarchar(MAX) нулевой |
Xml |
string |
nvarchar(MAX) недействительный |
Настраиваемый репозиторий ключей
Если встроенные механизмы не подходят, разработчик может указать собственный механизм сохранения ключа, предоставив настраиваемый механизм IXmlRepository.
ASP.NET Core