Поставщики хранилищ ключей в ASP.NET Core
Система защиты данных использует механизм обнаружения по умолчанию , чтобы определить, где должны храниться криптографические ключи. Разработчик может переопределить механизм обнаружения по умолчанию и вручную указать расположение.
Предупреждение
Если указать явное расположение сохраняемости ключей, система защиты данных отменяет шифрование ключей по умолчанию в rest механизме, поэтому ключи больше не шифруются.rest Рекомендуется дополнительно указать явный механизм шифрования ключей для рабочих развертываний.
Файловая система
Чтобы настроить репозиторий ключей на основе файловой системы, вызовите подпрограмму PersistKeysToFileSystem конфигурации, как показано ниже. Укажите указатель на репозиторий DirectoryInfo , в котором должны храниться ключи:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
Можно DirectoryInfo
указать каталог на локальном компьютере или указать папку в сетевой папке. Если указатель на каталог на локальном компьютере (и сценарий заключается в том, что только приложения на локальном компьютере требуют доступа к этому репозиторию), рассмотрите возможность шифрования ключей restв Windows DPAPI (в Windows). В противном случае рекомендуется использовать сертификат X.509 для шифрования ключей по адресуrest.
Хранилище Azure
Пакет Azure.Extensions.AspNetCore.DataProtection.Blobs позволяет хранить ключи защиты данных в Хранилище BLOB-объектов Azure. Ключи можно совместно использовать в нескольких экземплярах веб-приложения. Приложения могут совместно использовать файлы cookie проверки подлинности или защиту CSRF на нескольких серверах.
Чтобы настроить поставщик Хранилище BLOB-объектов Azure, вызовите одну из 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.
Иногда приложение может не иметь доступа на запись к файловой системе. Рассмотрим сценарий, в котором приложение выполняется в качестве учетной записи виртуальной службы (например, пул identityприложений w3wp.exe). В таких случаях администратор может подготовить раздел реестра, доступный учетной записью identityслужбы. PersistKeysToRegistry Вызовите метод расширения, как показано ниже. RegistryKey Укажите расположение, в котором должны храниться криптографические ключи:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Внимание
Рекомендуется использовать DPAPI Windows для шифрования ключей rest.
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