Поставщики хранилищ ключей в ASP.NET Core

Система защиты данных использует механизм обнаружения по умолчанию , чтобы определить, где должны храниться криптографические ключи. Разработчик может переопределить механизм обнаружения по умолчанию и вручную указать расположение.

Предупреждение

Если указать явное расположение сохраняемости ключей, система защиты данных отменяет регистрацию шифрования ключей по умолчанию при хранении, поэтому ключи больше не шифруются неактивных данных. Рекомендуется дополнительно указать явный механизм шифрования ключей для рабочих развертываний.

Файловая система

Чтобы настроить репозиторий ключей на основе файловой системы, вызовите подпрограмму PersistKeysToFileSystem конфигурации, как показано ниже. Укажите указатель на репозиторий DirectoryInfo , в котором должны храниться ключи:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}

Можно DirectoryInfo указать каталог на локальном компьютере или указать папку в сетевой папке. Если указатель на каталог на локальном компьютере (и сценарий заключается в том, что только приложения на локальном компьютере требуют доступа к этому репозиторию), рассмотрите возможность использования DPAPI Windows (в Windows) для шифрования неактивных ключей. В противном случае рекомендуется использовать сертификат X.509 для шифрования неактивных ключей.

Хранилище 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.служба хранилища. Большие двоичные объекты.

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));
}

Важно!

Рекомендуется использовать DPAPI Windows для шифрования неактивных ключей.

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

MyKeysContextDbContext определяется в предыдущем примере кода. Если вы используете DbContext другое имя, замените имя DbContextMyKeysContext.

Класс DataProtectionKeys или сущность принимает структуру, показанную в следующей таблице.

Свойство/поле Тип CLR Тип SQL
Id int int, PK, IDENTITY(1,1)не null
FriendlyName string nvarchar(MAX)Null
Xml string nvarchar(MAX)Null

Настраиваемый репозиторий ключей

Если встроенные механизмы не подходят, разработчик может указать собственный механизм сохранения ключа, предоставив настраиваемый IXmlRepositoryмеханизм.