ASP.NET Core の ASP.NET machineKey を置き換えるReplace the ASP.NET machineKey in ASP.NET Core

<machineKey>ASP.NET の要素の実装は置き換えることができます。The implementation of the <machineKey> element in ASP.NET is replaceable. これにより、ASP.NET 暗号化ルーチンのほとんどの呼び出しは、新しいデータ保護システムを含む代替のデータ保護メカニズムを通じてルーティングされます。This allows most calls to ASP.NET cryptographic routines to be routed through a replacement data protection mechanism, including the new data protection system.

パッケージ インストールPackage installation

注意

新しいデータ保護システムは、.NET 4.5.1 以降を対象とする既存の ASP.NET アプリケーションにのみインストールできます。The new data protection system can only be installed into an existing ASP.NET application targeting .NET 4.5.1 or later. アプリケーションが .NET 4.5 以下を対象としている場合、インストールは失敗します。Installation will fail if the application targets .NET 4.5 or lower.

新しいデータ保護システムを既存の ASP.NET 4.5.1 + プロジェクトにインストールするには、パッケージ Microsoft.AspNetCore.DataProtection.SystemWeb にインストールします。To install the new data protection system into an existing ASP.NET 4.5.1+ project, install the package Microsoft.AspNetCore.DataProtection.SystemWeb. これにより、 既定の構成 設定を使用してデータ保護システムがインスタンス化されます。This will instantiate the data protection system using the default configuration settings.

パッケージをインストールすると、 Web.config に行が挿入されます。これにより、フォーム認証、ビューステート、および ASP.NET の呼び出しなど、 ほとんどの暗号化操作に使用するように指示されます。When you install the package, it inserts a line into Web.config that tells ASP.NET to use it for most cryptographic operations, including forms authentication, view state, and calls to MachineKey.Protect. 挿入された行は次のように読み取られます。The line that's inserted reads as follows.

<machineKey compatibilityMode="Framework45" dataProtectorType="..." />

ヒント

新しいデータ保護システムがアクティブであるかどうかを確認するには、のようなフィールド __VIEWSTATE を調べます。次の例のように、"CfDJ8" で始まる必要があります。You can tell if the new data protection system is active by inspecting fields like __VIEWSTATE, which should begin with "CfDJ8" as in the example below. "CfDJ8" は、データ保護システムによって保護されているペイロードを識別するマジック "09 F0 C9 F0" ヘッダーの base64 表現です。"CfDJ8" is the base64 representation of the magic "09 F0 C9 F0" header that identifies a payload protected by the data protection system.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">

パッケージの構成Package configuration

データ保護システムは、既定のゼロセットアップ構成を使用してインスタンス化されます。The data protection system is instantiated with a default zero-setup configuration. ただし、既定ではキーはローカルファイルシステムに保存されるため、ファームに配置されているアプリケーションでは機能しません。However, since by default keys are persisted to the local file system, this won't work for applications which are deployed in a farm. これを解決するには、DataProtectionStartup にサブクラスを作成し、その ConfigureServices メソッドをオーバーライドする型を作成して、構成を提供します。To resolve this, you can provide configuration by creating a type which subclasses DataProtectionStartup and overrides its ConfigureServices method.

次に示すのは、キーが永続化される場所と保存時に暗号化する方法の両方を構成したカスタムデータ保護のスタートアップの種類の例です。Below is an example of a custom data protection startup type which configured both where keys are persisted and how they're encrypted at rest. また、独自のアプリケーション名を指定することで、既定のアプリ分離ポリシーをオーバーライドします。It also overrides the default app isolation policy by providing its own application name.

using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.SystemWeb;
using Microsoft.Extensions.DependencyInjection;

namespace DataProtectionDemo
{
    public class MyDataProtectionStartup : DataProtectionStartup
    {
        public override void ConfigureServices(IServiceCollection services)
        {
            services.AddDataProtection()
                .SetApplicationName("my-app")
                .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\myapp-keys\"))
                .ProtectKeysWithCertificate("thumbprint");
        }
    }
}

ヒント

<machineKey applicationName="my-app" ... />SetApplicationName への明示的な呼び出しの代わりにを使用することもできます。You can also use <machineKey applicationName="my-app" ... /> in place of an explicit call to SetApplicationName. これは、構成するすべてのユーザーがアプリケーション名を設定していた場合に、開発者が DataProtectionStartup 派生型を作成する必要がないようにするための便利なメカニズムです。This is a convenience mechanism to avoid forcing the developer to create a DataProtectionStartup-derived type if all they wanted to configure was setting the application name.

このカスタム構成を有効にするには、[Web.config に戻り、 <appSettings> パッケージのインストールによって構成ファイルに追加された要素を探します。To enable this custom configuration, go back to Web.config and look for the <appSettings> element that the package install added to the config file. 次のマークアップが表示されます。It will look like the following markup:

<appSettings>
  <!--
  If you want to customize the behavior of the ASP.NET Core Data Protection stack, set the
  "aspnet:dataProtectionStartupType" switch below to be the fully-qualified name of a
  type which subclasses Microsoft.AspNetCore.DataProtection.SystemWeb.DataProtectionStartup.
  -->
  <add key="aspnet:dataProtectionStartupType" value="" />
</appSettings>

空の値に、先ほど作成した DataProtectionStartup 派生型のアセンブリ修飾名を入力します。Fill in the blank value with the assembly-qualified name of the DataProtectionStartup-derived type you just created. アプリケーションの名前が DataProtectionDemo の場合、これは次のようになります。If the name of the application is DataProtectionDemo, this would look like the below.

<add key="aspnet:dataProtectionStartupType"
     value="DataProtectionDemo.MyDataProtectionStartup, DataProtectionDemo" />

これで、新しく構成されたデータ保護システムをアプリケーション内で使用する準備ができました。The newly-configured data protection system is now ready for use inside the application.