ASP.NET Core での ASP.NET machineKey の置換

ASP.NET 内の <machineKey> 要素の実装は置き換えることができます。 これにより、新しいデータ保護システムなど、置き換え後のデータ保護メカニズムを使用して、ASP.NET 暗号化ルーチンのほとんどの呼び出しをルーティングできます。

パッケージ インストール

注意

新しいデータ保護システムは、.NET 4.5.1 以降を対象とする既存の ASP.NET アプリケーションにのみインストールできます。 アプリケーションが .NET 4.5 以下を対象としている場合、インストールは失敗します。

新しいデータ保護システムを既存の ASP.NET 4.5.1+ プロジェクトにインストールするには、Microsoft.AspNetCore.DataProtection.SystemWeb パッケージをインストールします。 これにより、データ保護システムが既定の構成設定を使用してインスタンス化されます。

パッケージをインストールすると、フォーム認証、ビュー状態、MachineKey.Protect の呼び出しなどのほとんどの暗号化操作にそれを使用するよう ASP.NET に指示する行が Web.config に挿入されます。 データ保護 API は使用されません。 挿入された行は次のようになります。

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

ヒント

新しいデータ保護システムがアクティブであるかどうかを確認するには、__VIEWSTATE のようなフィールドを調べます。これは次の例のように、"CfDJ8" で始まります。 "CfDJ8" は、データ保護システムによって保護されているペイロードを識別するマジック "09 F0 C9 F0" ヘッダーの base64 表現です。

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

パッケージ構成

データ保護システムは、既定のゼロセットアップ構成を使用してインスタンス化されます。 ただし、既定ではキーはローカル ファイル システムに保持されるため、ファームにデプロイされているアプリケーションでは機能しません。 これを解決するには、DataProtectionStartup をサブクラス化し、その ConfigureServices メソッドをオーバーライドする型を作成して、構成を提供します。

次に示すのは、キーが保持される場所と保存時に暗号化する方法の両方を構成したカスタム データ保護のスタートアップの種類の例です。 また、独自のアプリケーション名を指定することで、既定のアプリ分離ポリシーをオーバーライドします。

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

ヒント

SetApplicationName への明示的な呼び出しの代わりに <machineKey applicationName="my-app" ... /> を使用することもできます。 これは、開発者がアプリケーション名の設定だけを構成したい場合に、DataProtectionStartup 派生型を作成する必要をなくすための便利なメカニズムです。

このカスタム構成を有効にするには、Web.config に戻り、パッケージのインストールによって構成ファイルに追加された <appSettings> 要素を探します。 これは次のマークアップのようになります。

<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 派生型のアセンブリ修飾名を入力します。 アプリケーションの名前が DataProtectionDemo の場合、これは次のようになります。

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

これで、新しく構成されたデータ保護システムをアプリケーション内で使用する準備ができました。