ナビゲーション リンクのスキップホーム > そのまま使えるシリーズ > そのまま使えるMachineKey(ASP.NET設定スキーマ)

そのまま使えるMachineKey(ASP.NET設定スキーマ)

このページは、2016年10月3日現在の情報に基づいて掲載しております。
情報の信頼性は、法令の改正や温暖化の進行具合、摂取したコラーゲンの量、ムカデがどの足から歩き出したか等の様々な事象の影響を受け、日々刻々と常に変化しております。

Decryption: AutoGenerate,IsolateApps
Validation: AutoGenerate,IsolateApps

上記のパラメータを変更すると、即時に構文が生成されます。
DecryptionKeyとValidationKeyは、System.Security.Cryptography.RNGCryptoServiceProviderによってランダムに生成しています。
生成された構文と全く同じ構文が再び生成される保証はありませんので、忘れてしまった場合には新しい構文を生成してください。
生成された構文は、みなさまご自身の判断と責任において、ご自由にご活用ください。

参考: [MSDN] machineKey 要素 (ASP.NET 設定スキーマ)

構文:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="HMACSHA256" decryption="Auto" />

構文のコピー

レンタルサーバも無縁ではないMachineKey

昨日完成したWebフォームを開きっぱなしで寝て、興奮も冷めやらぬ翌日に実行ボタンを押してみると、

viewstate MAC の検証に失敗しました。
このアプリケーションが Web Farm またはクラスターによってホストされている場合、<machineKey> 構成が同一の validationKey および検証アルゴリズムを指定していることを確認してください。
AutoGenerate をクラスターで使用することはできません。
というエラー画面が・・・。
一番安いレンタルサーバのプランなのに、クラスタ?みたいな、なんともちんぷんかんぷんな事態に。

Web検索してみると、いろんな方がはまったまま抜け出せずにいたりしますが、要するにMachineKeyをIIS任せにしなければよい、ということなのだろうと理解。
MachineKeyは、平たく言えば、選択したアルゴリズムに応じた桁数の16進数を並べておけばよいだけなのですが、HMACSHA512を選択すると128文字も考えることになりますので、さすがにそれは・・・とさらに検索していると、MachineKeyを生成する方法がMSDNで紹介されておりました。

その方法とは、System.Security.Cryptography.RNGCryptoServiceProviderクラスを使用して、必要な桁数の16進数を生成するプログラムを開発すること。
とはいえ、ひとつのWebサイトに対して何度も生成しないであろうMachineKeyのためにわざわざコードを書くとなれば、誰もが二の足を踏むはず。
その結果、いろんな方がはまったまま抜け出せずにいるのだろうと思い至りまして、公開することにいたしました。

ここでもやっぱり乱数(ただし今回はより厳密に)

「そのまま使えるランダム画像」のときに、2種類の乱数生成クラスを紹介しておりますが、そのうちの「より厳密な乱数を生成するクラス」を使用しております。
具体的には、System.Security.Cryptography.RNGCryptoServiceProviderクラスを使用しております。
作ってしまえば単純なものですので、手っ取り早くコードを出してみましょう。

using (var __rngCsp = new System.Security.Cryptography.RNGCryptoServiceProvider())
{
    byte[] __buff = new byte[64];
    __rngCsp.GetBytes(__buff);
    var __keyString = new System.Text.StringBuilder(__keyLength * 2);
    for (int i = 0; i < __buff.Length; i++)
        __keyString.Append(string.Format("{0:X2}", __buff[i]));

    Console.WriteLine(__keyString.ToString());
}
さくっと書くとこんな感じです。
RNGCryptoServiceProviderクラスは、IDisposableインタフェースですので、使用後にDisposeすることをお忘れなく。
私は忘れっぽいので、IDisposableインタフェースなクラスは、必ずusingで囲むことにしています。

このページでは、アルゴリズムの選択が可能になっておりますので、選択したアルゴリズムに応じた桁数を生成できるように作り込んでおります。
また、「そのまま使える」でなければいけませんので、web.configにそのまま貼れるように、MachineKey要素の構文を丸ごと生成するようにしております。

手軽にさくっとXML構文を作る方法

XML Linqが登場したことにより、XML構文の動的な作成が手軽に行えるようになりました。
どのくらい手軽かと言いますと、

var __machineKey = new System.Xml.Linq.XElement("machineKey",
    new System.Xml.Linq.XAttribute("validationKey", "A48A6A446F9316A25978B3655C8EE0C15062C7B07B11FE56****************"),
    new System.Xml.Linq.XAttribute("decryptionKey", "FBBA07659E07D1151C22838C02CD0DE8BDC603629972896B****************"),
    new System.Xml.Linq.XAttribute("validation", "HMACSHA256"),
    new System.Xml.Linq.XAttribute("decryption", "Auto"));

Console.WriteLine(__machineKey.ToString());
たったこれだけです。簡単ですね。

自動ポストバック

テキストボックスやドロップダウンリスト、チェックボックスなどの変更を即時に反映させたいときは、AutoPostBack属性をTrueにするだけです。

<asp:CheckBox ID="CheckBox1" AutoPostBack="true" runat="server" />
あとは、Page_Loadにコードを書くだけです。
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ・
        ・
        ・
    }
    else
    {
        ・
        ・
        ・
    }
}
ASP.NETの進化によって、とっても簡単に書けるようになりました。

本サイトは、下記のサイトポリシーに同意いただいたうえでご利用ください。

サイトポリシー | お問い合わせ | 運営会社(株式会社GAIDE)

Copyright © 2016 GAIDE CO., LTD. All rights reserved.