この記事は、 ASP.NET 1.1 から ASP.NET 2.0 にアップグレードするときに考慮する必要がある Cookie の問題を補足するもので、サンプル コードを使用して、ASP.NET 1.1 および ASP でランダムに生成された Cookie 暗号化キーと検証キーを取得する方法を説明します。 .NET 2.0 によるリフレクション。
ASP.NET 1.1 サンプル コード:
object machineKeyConfig = HttpContext.Current.GetConfig("system.web/machineKey");
//System.Web.Configuration.MachineKey+MachineKeyConfig のインスタンスを取得します。MachineKeyConfig は MachineKey のネストされたクラスです。
Type machineKeyType = machineKeyConfig.GetType().Assembly.GetType("System.Web.Configuration.MachineKey");
// System.Web.Configuration.MachineKey 型の
BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Static を取得します。
// バインディング フラグを設定します
MethodInfo byteArrayToHexString = machineKeyType.GetMethod("ByteArrayToHexString", bf);
//リフレクションを通じて MachineKey の ByteArrayToHexString メソッドを取得します。これは、バイト配列を 16 進文字列に変換するために使用されます。
Byte[] validationKey = (Byte[])machineKeyType.GetField("s_validationKey",bf).GetValue (machineKeyConfig);
//検証キーのバイト配列を取得します
SymmetricAlgorithm アルゴリズム = (SymmetricAlgorithm)machineKeyType.GetField("s_oDes",bf).GetValue(machineKeyConfig);
Byte[] 復号化キー = アルゴリズム.キー;
//暗号化キーのバイト配列を取得する
string ValidationKey = (string)byteArrayToHexString.Invoke(null,new object[]{validationKey,validationKey.Length});
//検証キーのバイト配列を16進数で表される文字列に変換します
string DecryptionKey = (string)byteArrayToHexString.Invoke(null,new object[]{decryptionKey,decryptionKey.Length});
//暗号化キーのバイト配列を16進数で表される文字列に変換します
ASP.NET 2.0 のサンプル コード:
System.Web.Configuration.MachineKeySection machineKeySection = new System.Web.Configuration.MachineKeySection();
//MachineKeySection のインスタンスを直接作成します。ASP.NET 2.0 では、machineKeySection は ASP.NET 1.1 の MachineKey を置き換えるために使用され、直接アクセスできますが、内部的には保護されません。
Type type = typeof(System.Web.Configuration.MachineKeySection);//または machineKeySection.GetType();
PropertyInfo propertyInfo = type.GetProperty("ValidationKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance);
Byte[] validationKeyArray = (Byte[])propertyInfo.GetValue(machineKeySection, null);
//ランダムに生成された検証キーのバイト配列を取得します
propertyInfo = type.GetProperty("DecryptionKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance);
Byte[] decryptionKeyArray = (Byte[])propertyInfo.GetValue(machineKeySection, null);
//ランダムに生成された暗号化キーのバイト配列を取得します
MethodInfo byteArrayToHexString = type.GetMethod("ByteArrayToHexString", BindingFlags.Static | BindingFlags.NonPublic);
//リフレクションを通じて MachineKeySection の ByteArrayToHexString メソッドを取得します。これは、バイト配列を 16 進文字列に変換するために使用されます。
string validationKey = (string)byteArrayToHexString.Invoke(null, new object[] { validationKeyArray, validationKeyArray.Length });
//検証キーのバイト配列を16進数で表される文字列に変換します
string DecryptionKey = (string)byteArrayToHexString.Invoke(null, new object[] { decryptionKeyArray, decryptionKeyArray.Length });
//暗号化キーのバイト配列を 16 進文字列に変換します
//著者のブログ: http://dudu.cnblogs.com