ASP.NET Core のキー記憶域プロバイダーKey storage providers in ASP.NET Core

データ保護システムでは、暗号化キーの保存先を決定するために、 既定で検出メカニズム が使用されます。The data protection system employs a discovery mechanism by default to determine where cryptographic keys should be persisted. 開発者は、既定の検出メカニズムを上書きし、場所を手動で指定できます。The developer can override the default discovery mechanism and manually specify the location.

警告

明示的なキーの保存場所を指定した場合、データ保護システムは解除の既定のキー暗号化メカニズムを使用するので、保存時にキーが暗号化されなくなります。If you specify an explicit key persistence location, the data protection system deregisters the default key encryption at rest mechanism, so keys are no longer encrypted at rest. 運用環境のデプロイで は、明示的なキー暗号化メカニズム を追加で指定することをお勧めします。It's recommended that you additionally specify an explicit key encryption mechanism for production deployments.

ファイル システムFile system

ファイルシステムベースのキーリポジトリを構成するには、次に示すように、 Persistkeystofilesystem 構成ルーチンを呼び出します。To configure a file system-based key repository, call the PersistKeysToFileSystem configuration routine as shown below. キーを格納するリポジトリを指す DirectoryInfo を指定します。Provide a DirectoryInfo pointing to the repository where keys should be stored:

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

は、 DirectoryInfo ローカルコンピューター上のディレクトリを指すことも、ネットワーク共有上のフォルダーを指すこともできます。The DirectoryInfo can point to a directory on the local machine, or it can point to a folder on a network share. ローカルコンピューター上のディレクトリを指している場合 (つまり、このリポジトリを使用するためにアクセスが必要なのはローカルコンピューター上のアプリのみです)、windows DPAPI (windows) を使用して保存時のキーを暗号化することを検討してください。If pointing to a directory on the local machine (and the scenario is that only apps on the local machine require access to use this repository), consider using Windows DPAPI (on Windows) to encrypt the keys at rest. それ以外の場合は、 x.509 証明書 を使用して保存時のキーを暗号化することを検討してください。Otherwise, consider using an X.509 certificate to encrypt keys at rest.

Azure StorageAzure Storage

AspNetCoreパッケージを使用すると、Azure Blob Storage にデータ保護キーを格納できます。The Azure.Extensions.AspNetCore.DataProtection.Blobs package allows storing data protection keys in Azure Blob Storage. キーは、web アプリの複数のインスタンス間で共有できます。Keys can be shared across several instances of a web app. アプリは、認証 cookie s または CSRF 保護を複数のサーバーで共有できます。Apps can share authentication cookies or CSRF protection across multiple servers.

Azure Blob Storage プロバイダーを構成するには、 Persistkeystoazureblobstorage オーバーロードのいずれかを呼び出します。To configure the Azure Blob Storage provider, call one of the PersistKeysToAzureBlobStorage overloads.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}

Web アプリが Azure サービスとして実行されている場合は、接続文字列を使用して azure storage に対する認証を行うことができます。 blobを使用します。If the web app is running as an Azure service, connection string can be used to authenticate to Azure storage by using Azure.Storage.Blobs.

string connectionString = "<connection_string>";
string containerName = "my-key-container";
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);

// optional - provision the container automatically
await container.CreateIfNotExistsAsync();

services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(container, "keys.xml");

注意

ストレージアカウントへの接続文字列は、Azure Portal の [アクセスキー] セクションで確認するか、次の CLI コマンドを実行して確認できます。The connection string to your storage account can be found in the Azure Portal under the "Access Keys" section or by running the following CLI command:

az storage account show-connection-string --name <account_name> --resource-group <resource_group>

RedisRedis

StackExchangeRedisパッケージは、Redis cache にデータ保護キーを格納することを許可します。The Microsoft.AspNetCore.DataProtection.StackExchangeRedis package allows storing data protection keys in a Redis cache. キーは、web アプリの複数のインスタンス間で共有できます。Keys can be shared across several instances of a web app. アプリは、認証 cookie s または CSRF 保護を複数のサーバーで共有できます。Apps can share authentication cookies or CSRF protection across multiple servers.

AspNetCoreパッケージを使用すると、redis cache にデータ保護キーを格納できます。The Microsoft.AspNetCore.DataProtection.Redis package allows storing data protection keys in a Redis cache. キーは、web アプリの複数のインスタンス間で共有できます。Keys can be shared across several instances of a web app. アプリは、認証 cookie s または CSRF 保護を複数のサーバーで共有できます。Apps can share authentication cookies or CSRF protection across multiple servers.

Redis でを構成するには、 PersistKeysToStackExchangeRedis オーバーロードのいずれかを呼び出します。To configure on Redis, call one of the PersistKeysToStackExchangeRedis overloads:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}

Redis でを構成するには、 PersistKeysToRedis オーバーロードのいずれかを呼び出します。To configure on Redis, call one of the PersistKeysToRedis overloads:

public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToRedis(redis, "DataProtection-Keys");
}

詳細については、次のトピックを参照してください。For more information, see the following topics:

レジストリRegistry

Windows の展開にのみ適用されます。Only applies to Windows deployments.

場合によっては、アプリケーションにファイルシステムへの書き込みアクセス権がないことがあります。Sometimes the app might not have write access to the file system. アプリが仮想サービスアカウント ( w3wp.exe のアプリプール id など) として実行されているシナリオについて考えてみましょう。Consider a scenario where an app is running as a virtual service account (such as w3wp.exe 's app pool identity). このような場合、管理者は、サービスアカウント id によってアクセス可能なレジストリキーをプロビジョニングできます。In these cases, the administrator can provision a registry key that's accessible by the service account identity. 次に示すように、 PersistKeysToRegistry extension メソッドを呼び出します。Call the PersistKeysToRegistry extension method as shown below. 暗号化キーを格納する場所を指す RegistryKey を指定します。Provide a RegistryKey pointing to the location where cryptographic keys should be stored:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys"));
}

重要

Rest でのキーの暗号化には WINDOWS DPAPI を使用することをお勧めします。We recommend using Windows DPAPI to encrypt the keys at rest.

Entity Framework CoreEntity Framework Core

AspNetCore コアパッケージは、Entity Framework Core を使用してデータベースにデータ保護キーを格納するためのメカニズムを提供します。The Microsoft.AspNetCore.DataProtection.EntityFrameworkCore package provides a mechanism for storing data protection keys to a database using Entity Framework Core. Microsoft.AspNetCore.DataProtection.EntityFrameworkCoreNuGet パッケージは、プロジェクトファイルに追加する必要があります。これは、 AspNetCore メタパッケージの一部ではありません。The Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet package must be added to the project file, it's not part of the Microsoft.AspNetCore.App metapackage.

このパッケージでは、web アプリの複数のインスタンス間でキーを共有できます。With this package, keys can be shared across multiple instances of a web app.

EF Core プロバイダーを構成するには、 Persistkeystodbcontext <TContext> メソッドを呼び出します。To configure the EF Core provider, call the PersistKeysToDbContext<TContext> method:

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 ディスカッション イシューにてお知らせください。If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

ジェネリックパラメーターは、 TContext dbcontext から継承し、 IDataProtectionKeyContextを実装する必要があります。The generic parameter, TContext, must inherit from DbContext and implement 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 テーブルを作成します。Create the DataProtectionKeys table.

パッケージマネージャーコンソール (PMC) ウィンドウで、次のコマンドを実行します。Execute the following commands in the Package Manager Console (PMC) window:

Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext

MyKeysContext は、 DbContext 前のコードサンプルで定義されているです。MyKeysContext is the DbContext defined in the preceding code sample. を別の名前で使用している場合は DbContextDbContext の名前に置き換え MyKeysContext ます。If you're using a DbContext with a different name, substitute your DbContext name for MyKeysContext.

DataProtectionKeysクラス/エンティティは、次の表に示す構造を採用しています。The DataProtectionKeys class/entity adopts the structure shown in the following table.

プロパティ/フィールドProperty/Field CLR 型CLR Type SQL 型SQL Type
Id int int、PK、 IDENTITY(1,1) 、null 以外int, PK, IDENTITY(1,1), not null
FriendlyName string nvarchar(MAX)、nullnvarchar(MAX), null
Xml string nvarchar(MAX)、nullnvarchar(MAX), null

カスタムキーリポジトリCustom key repository

インボックス機構が適切でない場合、開発者はカスタム IXmlRepositoryを提供することで、独自のキー永続化メカニズムを指定できます。If the in-box mechanisms aren't appropriate, the developer can specify their own key persistence mechanism by providing a custom IXmlRepository.