しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET 4.5 で MachineKey の扱いが微妙に変わっていた

全く気が付かなかったんですが、ASP.NET 4.5 では MachineKey を使った暗号化の処理が拡張されていて、それによってフォーム認証のチケットの互換性が無くなっていました。

最初は原因が全く分からなかったので色々と試したのですが、どうやら ASP.NET 4.5 向けにプロジェクトを作成すると、自動的に生成される Web.config に以下のように記載された targetFramework の値によって挙動が変わるようでした。

<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5" />

つまり httpRuntime 要素の targetFramework 属性の値が "4.5" の場合には、自動的に新しい方式が使われるので ASP.NET 4.5 より古いアプリケーションとフォーム認証のチケットを共有する場合には、machineKey 要素の compatibilityMode 属性の値を変更する必要があります。

詳しくは MSDN の該当記事を見るのが分かりやすいと思いました。というか心が折れました。

Framework45. Cryptographic enhancements for ASP.NET 4.5 are in effect. This is the default value if the application Web.config file has the targetFramework attribute of the httpRuntime element set to "4.5".

MachineKeySection.CompatibilityMode Property (System.Web.Configuration)

ASP.NET 4.5 のデフォルトでは Framework45 が指定されているので、ASP.NET 4 のアプリケーションと互換性を持たせたい場合には Framework20SP2 を指定します。

<machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES" compatibilityMode="Framework20SP2" />

これで ASP.NET 4 と互換性のあるチケットが発行されます。出来るだけフレームワークのバージョンは合わせておいた方が無難のようです。