Эта статья является дополнением к вопросам, связанным с файлами cookie, которые необходимо учитывать при обновлении с ASP.NET 1.1 до ASP.NET 2.0. В ней используется пример кода, иллюстрирующий, как получить случайно сгенерированные ключи шифрования и проверки файлов cookie в ASP.NET 1.1 и ASP. .NET 2.0 через отражение.
Пример кода ASP.NET 1.1:
объект MachineKeyConfig = HttpContext.Current.GetConfig("system.web/machineKey");
//Получаем экземпляр System.Web.Configuration.MachineKey+MachineKeyConfig. MachineKeyConfig — это вложенный класс 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);
//Получаем метод ByteArrayToHexString в MachineKey посредством отражения, который используется для преобразования массива байтов в шестнадцатеричную строку
Byte[] validationKey = (Byte[])machineKeyType.GetField("s_validationKey",bf).GetValue (machineKeyConfig);
//Получаем массив байтов ключа проверки
Алгоритм SymmetricAlgorithm = (SymmetricAlgorithm)machineKeyType.GetField("s_oDes",bf).GetValue(machineKeyConfig);
Байт[] ключ дешифрования = алгоритм.Ключ;
//Получаем массив байтов ключа шифрования
строка ValidationKey = (строка)byteArrayToHexString.Invoke(null,new object[]{validationKey,validationKey.Length});
//Преобразуем массив байтов ключа проверки в строку, представленную шестнадцатеричным числом
строка DecryptionKey = (строка)byteArrayToHexString.Invoke(null,new object[]{decryptionKey,decryptionKey.Length});
//Преобразуем массив байтов ключа шифрования в строку, представленную шестнадцатеричным числом
Пример кода ASP.NET 2.0:
System.Web.Configuration.MachineKeySection MachineKeySection = новый System.Web.Configuration.MachineKeySection();
//Непосредственное создание экземпляра MachineKeySection. В ASP.NET 2.0 MachineKeySection используется для замены MachineKey в ASP.NET 1.1, и к нему можно получить прямой доступ, и он не защищен внутренне.
Тип 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);
//Получить метод ByteArrayToHexString в MachineKeySection посредством отражения, который используется для преобразования массива байтов в шестнадцатеричную строку.
строка validationKey = (строка)byteArrayToHexString.Invoke (null, новый объект [] { validationKeyArray, validationKeyArray.Length });
//Преобразуем массив байтов ключа проверки в строку, представленную шестнадцатеричным числом
строка DecryptionKey = (строка) byteArrayToHexString.Invoke (нуль, новый объект [] { decryptionKeyArray, decryptionKeyArray.Length });
//Преобразуем массив байтов ключа шифрования в шестнадцатеричную строку
//Блог автора: http://dudu.cnblogs.com