บทความนี้เป็นส่วนเสริมของ ปัญหาคุกกี้ที่ต้องพิจารณาเมื่ออัปเกรดจาก ASP.NET 1.1 เป็น ASP.NET 2.0 โดยจะใช้โค้ดตัวอย่างเพื่อแสดงวิธีการรับการเข้ารหัสคุกกี้ที่สร้างขึ้นแบบสุ่มและคีย์การตรวจสอบใน 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 เป็นคลาสที่ซ้อนกันของ MachineKey
ประเภท 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);
ไบต์ [] decryptionKey = อัลกอริธึมคีย์;
// รับอาร์เรย์ไบต์ของคีย์การเข้ารหัส
สตริง ValidationKey = (สตริง) byteArrayToHexString.Inrigg (null, วัตถุใหม่ [] {validationKey, validationKey.Length});
//แปลงอาร์เรย์ไบต์ของคีย์การตรวจสอบให้เป็นสตริงที่แสดงด้วยเลขฐานสิบหก
สตริง DecryptionKey = (สตริง) byteArrayToHexString.Inrigg (null, วัตถุใหม่ [] {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 และสามารถเข้าถึงได้โดยตรงและไม่ได้รับการป้องกันภายใน
ประเภทประเภท = typeof (System.Web.Configuration.MachineKeySection); // หรือ machineKeySection.GetType ();
PropertyInfo propertyInfo = type.GetProperty ("ValidationKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance);
ไบต์ [] validationKeyArray = (ไบต์ [])propertyInfo.GetValue(machineKeySection, null);
//รับอาร์เรย์ไบต์คีย์การตรวจสอบที่สร้างขึ้นแบบสุ่ม
propertyInfo = type.GetProperty("DecryptionKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance);
ไบต์[] decryptionKeyArray = (ไบต์[])propertyInfo.GetValue(machineKeySection, null);
//รับอาร์เรย์ไบต์คีย์การเข้ารหัสที่สร้างขึ้นแบบสุ่ม
MethodInfo byteArrayToHexString = type.GetMethod("ByteArrayToHexString", BindingFlags.Static | BindingFlags.NonPublic);
//รับเมธอด ByteArrayToHexString ใน MachineKeySection ผ่านการสะท้อน ซึ่งใช้ในการแปลงอาร์เรย์ไบต์เป็นสตริงเลขฐานสิบหก
สตริง validationKey = (สตริง) byteArrayToHexString.Inrigg (null, วัตถุใหม่ [] { validationKeyArray, validationKeyArray.Length });
//แปลงอาร์เรย์ไบต์ของคีย์การตรวจสอบให้เป็นสตริงที่แสดงด้วยเลขฐานสิบหก
สตริง DecryptionKey = (สตริง) byteArrayToHexString.Inrigg (null, วัตถุใหม่ [] { decryptionKeyArray, decryptionKeyArray.Length });
// แปลงอาร์เรย์ไบต์ของคีย์การเข้ารหัสให้เป็นสตริงเลขฐานสิบหก
// บล็อกของผู้เขียน: http://dudu.cnblogs.com