ข้ามไปที่เนื้อหาหลัก
การสนับสนุน
ลงชื่อเข้าใช้
ลงชื่อเข้าใช้ด้วย Microsoft
ลงชื่อเข้าใช้หรือสร้างบัญชี
สวัสดี
เลือกบัญชีอื่น
คุณมีหลายบัญชี
เลือกบัญชีที่คุณต้องการลงชื่อเข้าใช้

สถานะมุมมองคืออะไร

ดูสถานะเป็นข้อมูลที่มีการปัดเศษระหว่างหน้าเว็บแบบ (aspx) ในแอพลิเคชัน ASP.NET มาร์กอัป HTML สำหรับเขตข้อมูล __VIEWSTATE คล้ายกับต่อไปนี้:

< ชนิดการป้อนข้อมูล = "ซ่อน" ชื่อ = "__VIEWSTATE" id = "__VIEWSTATE" ค่า = "..."/>ตัวอย่างหนึ่งของรายการที่อาจถูกเก็บไว้ในเขตข้อมูล __VIEWSTATE คือข้อความของตัวควบคุมปุ่ม ถ้าผู้ใช้คลิกปุ่มตัวจัดการเหตุการณ์ Button_Click จะสามารถแยกข้อความของปุ่มจากเขตข้อมูลสถานะมุมมอง ดูหัวข้อภาพรวม ASP.NET มุมมองของรัฐบนเว็บไซต์ Microsoft นักพัฒนาเครือข่าย (MSDN) สำหรับภาพรวมที่มีรายละเอียดมากขึ้นของสถานะมุมมอง ASP.NET เนื่องจากเขตข้อมูล __VIEWSTATE ประกอบด้วยข้อมูลที่สำคัญที่ใช้ในการสร้างหน้าใหม่บน postback ตรวจสอบให้แน่ใจว่าโจมตีไม่สามารถทำให้เกิดการยุ่งเกี่ยวกับเขตข้อมูลนี้ได้ ถ้าผู้โจมตีส่งสิ่งที่ต้องการ __VIEWSTATE ที่เป็นอันตรายผู้โจมตีอาจหลอกลวงแอพลิเคชันให้ดำเนินการกระทำที่เป็นอย่างอื่นจะไม่ได้ดำเนินการ เพื่อป้องกันการปลอมแปลงชนิดนี้, เขตข้อมูล __VIEWSTATE ได้รับการป้องกันโดยรหัสการรับรองความถูกต้องของข่าวสาร (MAC) ASP.NET ตรวจสอบ MAC ที่ส่งพร้อมกับน้ำหนักบรรทุก __VIEWSTATE เมื่อเกิดการ postback คีย์ที่ใช้ในการคำนวณ MAC จะถูกระบุในองค์ประกอบของแอพลิเคชันในแฟ้ม web.config เนื่องจากผู้โจมตีไม่สามารถคาดเดาเนื้อหาขององค์ประกอบ < machineKey > โจมตีไม่สามารถให้ MAC ที่ถูกต้องถ้าผู้โจมตีพยายามที่จะยุ่งเกี่ยวกับน้ำหนักบรรทุก __VIEWSTATE ASP.NET จะตรวจสอบว่าไม่มีการให้บริการ MAC ที่ถูกต้องและ ASP.NET จะปฏิเสธคำขอที่เป็นอันตราย

สิ่งที่ทำให้เกิดข้อผิดพลาดในการตรวจสอบ MAC

ข้อผิดพลาดการตรวจสอบ MAC จะคล้ายกับตัวอย่างต่อไปนี้:

ข้อผิดพลาดของเซิร์ฟเวอร์ใน '/' แอพลิเคชัน การตรวจสอบความถูกต้องของ viewstate MAC ล้มเหลว ถ้าโปรแกรมประยุกต์นี้เป็นโฮสต์โดยเว็บฟาร์มหรือคลัสเตอร์ให้แน่ใจว่า < machineKey > การตั้งค่าคอนฟิกระบุ validationKey เดียวกันและอัลกอริทึมการตรวจสอบ ไม่สามารถใช้สร้างอัตโนมัติในคลัสเตอร์ คำอธิบาย: มีข้อยกเว้นที่ไม่ได้จัดการเกิดขึ้นในระหว่างการดำเนินการร้องขอเว็บปัจจุบัน โปรดตรวจทานการติดตามสแต็คสำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและตำแหน่งที่เกิดขึ้นในรหัส รายละเอียดข้อยกเว้น: ระบบเว็บ. HttpException: การตรวจสอบความถูกต้องของเครื่อง MAC สถานะของ viewstate ล้มเหลว ถ้าโปรแกรมประยุกต์นี้เป็นโฮสต์โดยเว็บฟาร์มหรือคลัสเตอร์ให้แน่ใจว่าการตั้งค่าคอนฟิก < machineKey > ระบุ validationKey เดียวกันและอัลกอริทึมการตรวจสอบ ไม่สามารถใช้สร้างอัตโนมัติในคลัสเตอร์ ข้อผิดพลาดของแหล่งที่มา: [ไม่มีบรรทัดแหล่งที่เกี่ยวข้อง] แหล่งแฟ้ม: ... สาย: 0 การสืบค้นกลับกองซ้อน: [ViewStateException: ไม่ถูกต้องสถานะมุมมอง ไคลเอ็นต์ IP::: 1 พอร์ต: ๔๐๖๕๓ อ้าง: http://localhost:40643/MyPage.aspx เส้นทาง:/Mypyaspx ผู้ใช้ตัวแทน: Mozilla/5.0 (เข้ากันได้; MSIE ๑๐.๐; Windows NT ๖.๒; WOW64 ไทรเด้นท์/6.0) ViewState: ...] [HttpException (0x80004005): การตรวจสอบความถูกต้องของ viewstate MAC ล้มเหลว ถ้าโปรแกรมประยุกต์นี้เป็นโฮสต์โดยเว็บฟาร์มหรือคลัสเตอร์ให้แน่ใจว่าการตั้งค่าคอนฟิก < machineKey > ระบุ validationKey เดียวกันและอัลกอริทึมการตรวจสอบ ไม่สามารถใช้สร้างอัตโนมัติในคลัสเตอร์ ดู http://go.microsoft.com/fwlink/?LinkID=314055 สำหรับข้อมูลเพิ่มเติม] ระบบ. เว็บ. UI. ข้อผิดพลาดในการโยน (ข้อยกเว้นภายใน, สตริงที่ไม่มีสถานะ, Error macValidationError) + ๑๙๐ ThrowMacValidationError (ข้อยกเว้นภายใน, สตริงสเตท) + ๔๖ ระบบ. เว็บ. การยกเครื่องหมาย (สตริงที่ป้อนสายอักขระวัตถุประสงค์) + ๘๖๑ ระบบ. Web. UI. IStateFormatter2 การปรับให้เป็นระบบ (สายอักขระที่เป็นอนุกรม, วัตถุประสงค์วัตถุประสงค์) + ๕๑ ระบบเว็บ. DeserializeWithAssert (IStateFormatter2 formatter, สตริงที่เป็นอนุกรมของรัฐวัตถุประสงค์วัตถุประสงค์) + ๖๗ ระบบ. เว็บ. (UI) โหลด () + ๔๔๔ ระบบ. เว็บ. LoadPageStateFromPersistenceMedium () + ๓๖๘ ระบบ. เว็บ. UI. LoadAllState () + ๑๐๙ ระบบ. เว็บ. UI. หน้าการร้องขอหลัก (บูลี includeStagesBeforeAsyncPoint, บู๗๙๕๙ลีน ระบบ. เว็บ. UI. การร้องขอกระบวนการ (บูลี includeStagesBeforeAsyncPoint, บู๔๒๙ลีน การร้องขอการประมวลระบบเว็บ. UI. () + ๑๒๕ ระบบ. เว็บ. UI. หน้าการร้องขอโดยไม่มีการยืนยัน (บริบท HttpContext) + ๔๘ ระบบ. เว็บ. UI. การร้องขอกระบวนการ (บริบท HttpContext) + ๒๓๔ Mypage_aspx. ประมวลคำขอ (บริบท HttpContext) ใน ...: 0 ระบบ. เว็บ. การใช้งานระบบ. เว็บ........ การดำเนินการ () + ๑๓๐๐ ระบบ ExecuteStep (Iเอก Tionstep ขั้นตอน, บูลีน & completedSynchronously) + ๑๔๐

สาเหตุที่ 1: โปรแกรมประยุกต์บนเว็บกำลังทำงานในฟาร์ม (สภาพแวดล้อมแบบหลายเซิร์ฟเวอร์)

ASP.NET จะสร้างคีย์การเข้ารหัสลับสำหรับแต่ละโปรแกรมประยุกต์และจัดเก็บคีย์ในกลุ่มรีจิสทรี HKCU โดยอัตโนมัติ คีย์ที่สร้างโดยอัตโนมัตินี้จะใช้ถ้าไม่มีองค์ประกอบ < machineKey > ที่ชัดเจนในการกำหนดค่าของโปรแกรมประยุกต์ อย่างไรก็ตามเนื่องจากคีย์ที่สร้างโดยอัตโนมัตินี้อยู่ในเครื่องคอมพิวเตอร์ที่สร้างคีย์สถานการณ์สมมตินี้ทำให้เกิดปัญหาสำหรับโปรแกรมประยุกต์ที่ทำงานในฟาร์ม แต่ละเซิร์ฟเวอร์ในฟาร์มจะสร้างคีย์ท้องถิ่นของตัวเองและไม่มีเซิร์ฟเวอร์ในฟาร์มจะเห็นด้วยกับคีย์ที่ใช้ ผลลัพธ์คือว่าถ้าเซิร์ฟเวอร์หนึ่งสร้างเพย์โหลด __VIEWSTATE ที่เซิร์ฟเวอร์อื่นกินผู้บริโภคจะพบความล้มเหลวในการตรวจสอบความถูกต้องของ MAC

  • ความละเอียด 1a: สร้างองค์ประกอบ < machineKey > ที่ชัดเจน โดยการเพิ่มองค์ประกอบ < machineKey > ไปยังแฟ้ม web.config ของแอพลิเคชันผู้พัฒนาจะบอกให้ ASP.NET ไม่ใช้คีย์การเข้ารหัสลับที่สร้างขึ้นโดยอัตโนมัติ ดูภาคผนวก Aสำหรับคำแนะนำเกี่ยวกับวิธีการสร้างองค์ประกอบ < machineKey > หลังจากที่องค์ประกอบนี้ถูกเพิ่มไปยังแฟ้ม web.config ปรับใช้โปรแกรมประยุกต์กับแต่ละเซิร์ฟเวอร์ในฟาร์ม ทราบ บริการเว็บโฮสติ้งบางอย่างเช่นเว็บไซต์ Microsoft Azure ทำตามขั้นตอนการซิงโครไนส์คีย์ที่สร้างโดยอัตโนมัติของโปรแกรมประยุกต์แต่ละตัวบนเซิร์ฟเวอร์ back-end ซึ่งจะช่วยให้แอพลิเคชันที่ไม่ได้ระบุองค์ประกอบ < machineKey > ที่ชัดเจนเพื่อทำงานต่อไปในสภาพแวดล้อมเหล่านี้แม้ว่าโปรแกรมประยุกต์ที่กำลังทำงานอยู่ในฟาร์ม ถ้าโปรแกรมประยุกต์ของคุณกำลังทำงานอยู่บนบริการโฮสติ้งของบุคคลที่สามโปรดติดต่อผู้ให้บริการโฮสติ้งของคุณเพื่อตรวจสอบว่าสถานการณ์นี้มีผลบังคับใช้กับคุณหรือไม่

  • ความละเอียด 1b: เปิดใช้งาน affinity ในโหลดบาลานเซอร์ ถ้าไซต์ของคุณทำงานอยู่เบื้องหลังโหลดบาลานเซอร์คุณสามารถเปิดใช้งานความเกี่ยวข้องของเซิร์ฟเวอร์เพื่อหลีกเลี่ยงปัญหานี้ได้ การทำเช่นนี้ช่วยให้มั่นใจว่าไคลเอนต์ใดๆที่กำหนดเฉพาะโต้ตอบกับเซิร์ฟเวอร์ทางกายภาพที่อยู่เบื้องหลังโหลดบาลานเซอร์เพื่อให้เพย์โหลดที่เข้ารหัสลับทั้งหมดจะถูกสร้างขึ้นโดยและใช้โดยเซิร์ฟเวอร์เดียวกัน นี้ไม่ควรจะถือว่าเป็นวิธีการแก้ปัญหาระยะยาว. แม้ว่าความเกี่ยวข้องของเซิร์ฟเวอร์ถูกเปิดใช้งาน, โหลดส่วนใหญ่บาลานเซอร์จะเปลี่ยนเส้นทางไคลเอนต์ไปยังเซิร์ฟเวอร์ที่มีอยู่จริงที่แตกต่างกันถ้าเซิร์ฟเวอร์เดิมที่มีการโหลดบาลานเซอร์ถูกปรับให้เป็นแบบออฟไลน์ ซึ่งทำให้เซิร์ฟเวอร์ใหม่เพื่อปฏิเสธเพย์โหลดการเข้ารหัสลับ (เช่น __viewstate, ตั๋วการรับรองความถูกต้องแบบฟอร์ม, โทเค็นการต่อต้านการปลอมและบริการอื่นๆ) ที่ไคลเอนต์ที่มีอยู่ในขณะนี้ ใช้องค์ประกอบที่ชัดเจน < machineKey > และปรับใช้แอพลิเคชันควรจะเป็นที่ต้องการเกินความเกี่ยวข้องของเซิร์ฟเวอร์

สาเหตุที่ 2: กระบวนการของผู้ปฏิบัติงานใช้ข้อมูลเฉพาะตัวของพูลโปรแกรมประยุกต์ IIS ๗.๐

บริการข้อมูลทางอินเทอร์เน็ต (IIS) ๗.๐ (Windows Vista, Windows Server ๒๐๐๘) แนะนำข้อมูลเฉพาะตัวของพูลโปรแกรมประยุกต์กลไกการแยกใหม่ที่ช่วยให้การรักษาความปลอดภัยที่เพิ่มขึ้นสำหรับเซิร์ฟเวอร์ที่เรียกใช้โปรแกรมประยุกต์ ASP.NET อย่างไรก็ตามไซต์ที่กำลังทำงานอยู่ภายใต้ข้อมูลเฉพาะตัวของพูลโปรแกรมประยุกต์ไม่มีการเข้าถึงรีจิสทรี HKCU นี่คือที่ที่รันไทม์ ASP.NET เก็บคีย์ > machineKey ที่สร้าง < ขึ้นโดยอัตโนมัติ ผลลัพธ์คือว่า ASP.NET ไม่สามารถยืนยันคีย์ที่สร้างโดยอัตโนมัติเมื่อมีการรีเซ็ตพูลโปรแกรมประยุกต์ ดังนั้นทุกครั้ง w3wp.exe ถูกรีเซ็ตคีย์แบบใหม่จะถูกสร้างขึ้น ทราบ นี่ไม่ใช่ปัญหาใน IIS ๗.๕ (Windows 7, Windows Server ๒๐๐๘ R2) และรุ่นที่ใหม่กว่า ในรุ่นเหล่านี้ของ IIS, ASP.NET สามารถยืนยันคีย์ที่สร้างโดยอัตโนมัติในตำแหน่งที่ตั้งอื่นที่มีชีวิตอยู่รีเซ็ตพูลโปรแกรมประยุกต์

  • ความละเอียด 2a: ใช้ยูทิลิตี้ aspnet_regiis การติดตั้ง ASP.NET ประกอบด้วยยูทิลิตี, aspnet_regiis ยูทิลิตีนี้ช่วยให้ ASP.NET interface กับ IIS เพื่อทำการตั้งค่าคอนฟิกที่จำเป็นในการเรียกใช้โปรแกรมประยุกต์ที่มีการจัดการ หนึ่งในการตั้งค่าคอนฟิกเหล่านี้สร้างคีย์ที่จำเป็นในกลุ่มรีจิสทรีเพื่อเปิดใช้งานการค้างของคีย์เครื่องที่สร้างโดยอัตโนมัติ ขั้นแรกคุณต้องกำหนดว่าจะใช้พูลโปรแกรมประยุกต์ใดในเว็บไซต์ของคุณ ซึ่งสามารถกำหนดโดยใช้โปรแกรมอรรถประโยชน์inetmgrที่รวมอยู่ใน IIS เลือกไซต์ของคุณในมุมมองแผนภูมิทางด้านซ้ายคลิกขวาจัดการ Websitและจากนั้นคลิกการตั้งค่าขั้นสูง กล่องโต้ตอบที่ปรากฏขึ้นจะแสดงชื่อพูลโปรแกรมประยุกต์ การตั้งค่าขั้นสูง เพื่อนั่งร้านคีย์รีจิสทรีที่เหมาะสมสำหรับพูลโปรแกรมประยุกต์ ASP.NET ๔.๐ให้ทำตามขั้นตอนเหล่านี้:

    1. เปิดพร้อมท์คำสั่งการดูแลระบบ

    2. ค้นหาไดเรกทอรีที่เหมาะสมขึ้นอยู่กับว่าพูลโปรแกรมประยุกต์ของคุณเป็น๓๒บิตหรือ๖๔บิต:

      • พูลโปรแกรมประยุกต์๓๒บิต: cd/d%windir%\Microsoft.NET\Framework\v4.0.30319

      • พูลโปรแกรมประยุกต์๖๔บิต: cd/d%windir%\Microsoft.NET\Framework64\v4.0.30319

    3. ย้ายไปยังไดเร็กทอรีให้พิมพ์คำสั่งต่อไปนี้แล้วกด Enter:

      aspnet_regiis "การตั้งชื่อของ IIS

    ถ้าพูลโปรแกรมประยุกต์เป็น ASP.NET ๒.๐หรือ๓.๕พูลโปรแกรมประยุกต์ให้ทำตามขั้นตอนเหล่านี้:

    1. เปิดพร้อมท์คำสั่งการดูแลระบบ

    2. ค้นหาไดเรกทอรีที่เหมาะสมขึ้นอยู่กับว่าพูลโปรแกรมประยุกต์ของคุณเป็น๓๒บิตหรือ๖๔บิต:

      • พูลโปรแกรมประยุกต์๓๒บิต: cd/d%windir%\Microsoft.NET\Framework\v2.0.50727

      • พูลโปรแกรมประยุกต์๖๔บิต: cd/d%windir%\Microsoft.NET\Framework64\v2.0.50727

    3. ย้ายไปยังไดเร็กทอรีให้พิมพ์คำสั่งต่อไปนี้แล้วกด Enter:

      aspnet_regiis "การตั้งชื่อของ IIS

    ตัวอย่างเช่นถ้าพูลโปรแกรมประยุกต์ของคุณมีชื่อว่าApp Pool ของฉัน(เหมือนในรูปก่อนหน้า) ให้เรียกใช้คำสั่งต่อไปนี้:

    aspnet_regiis "IIS โปรแกรมประยุกต์ของฉัน" ทราบ บริการของระบบ APPHOSTSVC และอาจจะต้องมีการเรียกใช้สำหรับยูทิลิตี้ aspnet_regiis เพื่อแก้ปัญหา IIS APPPOOL \ * ชื่ออย่างเหมาะสม

  • ความละเอียด 2b: สร้างองค์ประกอบ < machineKey > ที่ชัดเจน โดยการเพิ่มองค์ประกอบ < machineKey > ไปยังแฟ้ม web.config ของแอพลิเคชันผู้พัฒนาจะบอกให้ ASP.NET ไม่ใช้คีย์การเข้ารหัสลับที่สร้างขึ้นโดยอัตโนมัติ ดูภาคผนวก Aสำหรับคำแนะนำเกี่ยวกับวิธีการสร้างองค์ประกอบ < machineKey >

สาเหตุที่ 3: พูลโปรแกรมประยุกต์ถูกกำหนดค่าโดยใช้ LoadUserProfile = false

ถ้าพูลโปรแกรมประยุกต์กำลังทำงานด้วยข้อมูลเฉพาะตัวแบบกำหนดเอง IIS อาจไม่ได้โหลดส่วนกำหนดค่าผู้ใช้สำหรับข้อมูลเฉพาะตัว นี้มีผลข้างเคียงของการทำให้รีจิสทรี HKCU ไม่พร้อมใช้งานสำหรับ ASP.NET เพื่อยืนยันการสร้างโดยอัตโนมัติ < machineKey > คีย์สร้างอัตโนมัติใหม่จะถูกสร้างขึ้นทุกครั้งที่แอพลิเคชันเริ่มต้นใหม่ ดูส่วนกำหนดค่าผู้ใช้บนเว็บไซต์ของ Microsoft สำหรับข้อมูลเพิ่มเติม

  • ความละเอียด 3a: ใช้ยูทิลิตี้ aspnet_regiis คำแนะนำสำหรับการนี้จะเหมือนกับความละเอียด 2a ดูส่วนนั้นสำหรับข้อมูลเพิ่มเติม

  • ความละเอียด 3b: ใช้ที่ชัดเจน < machineKey > โดยการเพิ่มองค์ประกอบ < machineKey > ไปยังแฟ้ม web.config ของแอพลิเคชันผู้พัฒนาจะบอกให้ ASP.NET ไม่ใช้คีย์การเข้ารหัสลับที่สร้างขึ้นโดยอัตโนมัติ ดูภาคผนวก Aสำหรับคำแนะนำเกี่ยวกับวิธีการสร้างองค์ประกอบ < machineKey >

  • ความละเอียด 3c: การเตรียมใช้คีย์รีจิสทรี HKCU ที่จำเป็นด้วยตนเอง ถ้าคุณไม่สามารถเรียกใช้ยูทิลิตี้ aspnet_regiis คุณสามารถใช้สคริปต์ Windows PowerShell เพื่อจัดเตรียมคีย์รีจิสทรีที่เหมาะสมใน HKCU ดูภาคผนวก Bสำหรับข้อมูลเพิ่มเติม

  • ความละเอียด 3d: ตั้ง LoadUserProfile = true สำหรับพูลโปรแกรมประยุกต์นี้ นอกจากนี้คุณยังสามารถเปิดใช้งานการโหลดส่วนกำหนดค่าผู้ใช้ภายในพูลโปรแกรมประยุกต์นี้ ซึ่งจะทำให้กลุ่มรีจิสทรี HKCU โฟลเดอร์แบบถาวรและตำแหน่งที่เก็บเฉพาะผู้ใช้อื่นๆพร้อมใช้งานสำหรับแอพลิเคชัน อย่างไรก็ตามนี้อาจทำให้การใช้ดิสก์หรือหน่วยความจำเพิ่มขึ้นสำหรับกระบวนการของผู้ปฏิบัติงาน ดูองค์ประกอบสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเปิดใช้งานการตั้งค่านี้

สาเหตุที่ 4: คุณสมบัติเพ. ViewStateUserKey มีค่าไม่ถูกต้อง

นักพัฒนาซอฟต์แวร์สามารถตัดสินใจที่จะใช้หน้า. ViewStateUserKeyคุณสมบัติการเพิ่มการป้องกันการปลอมการร้องขอข้ามไซต์ไปยังเขตข้อมูล __VIEWSTATE ถ้าคุณใช้คุณสมบัติเพจ ViewStateUserKeyจะถูกตั้งค่าโดยทั่วไปเป็นค่าเช่นชื่อผู้ใช้หรือตัวระบุเซสชันของผู้ใช้ปัจจุบัน เท็มเพลตโครงการสำหรับโปรแกรมประยุกต์ WebForms ใน Microsoft Visual Studio ๒๐๑๒และรุ่นที่ใหม่กว่าประกอบด้วยตัวอย่างที่ใช้คุณสมบัตินี้ ดูหัวข้อคุณสมบัติของเพจ ViewStateUserKeyบนเว็บไซต์ Microsoft นักพัฒนาเครือข่าย (MSDN) สำหรับข้อมูลเพิ่มเติม ถ้าคุณสมบัติViewstateuserkeyถูกระบุค่าของมันจะถูกเผาลงใน __VIEWSTATE ในเวลาที่สร้าง เมื่อมีการใช้ฟิลด์ __VIEWSTATE เซิร์ฟเวอร์จะตรวจสอบคุณสมบัติViewstateuserkeyของเพจปัจจุบันและทำให้เป็นไปตามค่าที่ใช้ในการสร้างเขตข้อมูล __VIEWSTATE ถ้าค่าไม่ตรงกันการร้องขอจะถูกปฏิเสธว่าอาจเป็นอันตราย ตัวอย่างของความล้มเหลวที่เกี่ยวข้องกับ ViewStateUserKey จะเป็นไคลเอนต์ที่มีสองแท็บที่เปิดอยู่ในเบราว์เซอร์ ไคลเอ็นต์ถูกเข้าสู่ระบบในฐานะผู้ใช้ A และในแท็บแรกเพจจะถูกแสดงด้วย __VIEWSTATE ซึ่งมีคุณสมบัติViewstateuserkeyประกอบด้วย "ผู้ใช้" ในแท็บที่สองไคลเอ็นต์ออกจากระบบและจากนั้นเข้าสู่ระบบกลับในฐานะผู้ใช้ B ไคลเอ็นต์กลับไปที่แท็บแรกและส่งแบบฟอร์ม คุณสมบัติViewstateuserkeyอาจประกอบด้วย "ผู้ใช้ B" (เนื่องจากเป็นสิ่งที่คุกกี้การรับรองความถูกต้องของไคลเอ็นต์กล่าวว่า) อย่างไรก็ตามฟิลด์ __VIEWSTATE ที่ไคลเอ็นต์ส่งประกอบด้วย "ผู้ใช้ A" ไม่ตรงกันนี้ทำให้เกิดความล้มเหลว

  • ความละเอียด 4a: ตรวจสอบว่า ViewStateUserKey ถูกตั้งค่าอย่างถูกต้อง ถ้าโปรแกรมประยุกต์ของคุณใช้คุณสมบัติViewstateuserkeyให้ตรวจสอบว่าค่าของคุณสมบัติเหมือนกันทั้งสองเมื่อมีการสร้างสถานะมุมมองและเมื่อมีการใช้งาน หากคุณกำลังใช้ชื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันโปรดตรวจสอบให้แน่ใจว่าผู้ใช้ยังคงเข้าสู่ระบบและไม่มีการเปลี่ยนแปลงรหัสประจำตัวของผู้ใช้ในขณะที่ย้อนกลับ ถ้าคุณกำลังใช้ตัวระบุเซสชันของผู้ใช้ปัจจุบันโปรดตรวจสอบให้แน่ใจว่าเซสชันไม่ได้หมดเวลา ถ้าคุณกำลังทำงานในสภาพแวดล้อมของฟาร์มโปรดตรวจสอบให้แน่ใจว่าองค์ประกอบ < machineKey > ตรงกัน ดูภาคผนวก Aสำหรับคำแนะนำเกี่ยวกับวิธีการสร้างองค์ประกอบเหล่านี้

ภาคผนวก A: วิธีการสร้างองค์ประกอบ < machineKey >

คำเตือนเกี่ยวกับความปลอดภัย มีหลายเว็บไซต์ที่จะสร้างองค์ประกอบ < machineKey > สำหรับคุณด้วยการคลิกปุ่มหนึ่ง อย่าใช้องค์ประกอบ < machineKey > ที่คุณได้รับจากเว็บไซต์เหล่านี้ มันเป็นไปไม่ได้ที่จะรู้ว่าคีย์เหล่านี้ถูกสร้างขึ้นอย่างปลอดภัยหรือถ้าพวกเขาจะถูกบันทึกไปยังฐานข้อมูลลับ คุณควรใช้องค์ประกอบการตั้งค่าคอนฟิก < machineKey > ที่คุณสร้างขึ้นเองเท่านั้น

หากต้องการสร้างองค์ประกอบ < machineKey > ด้วยตัวคุณเองคุณสามาใช้สคริปต์Windows PowerShellต่อไปนี้:

# Generates a <machineKey> element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
  [CmdletBinding()]
  param (
    [ValidateSet("AES", "DES", "3DES")]
    [string]$decryptionAlgorithm = 'AES',
    [ValidateSet("MD5", "SHA1", "HMACSHA256", "HMACSHA384", "HMACSHA512")]
    [string]$validationAlgorithm = 'HMACSHA256'
  )
  process {
    function BinaryToHex {
        [CmdLetBinding()]
        param($bytes)
        process {
            $builder = new-object System.Text.StringBuilder
            foreach ($b in $bytes) {
              $builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, "{0:X2}", $b)
            }
            $builder
        }
    }
    switch ($decryptionAlgorithm) {
      "AES" { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
      "DES" { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
      "3DES" { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
    }
    $decryptionObject.GenerateKey()
    $decryptionKey = BinaryToHex($decryptionObject.Key)
    $decryptionObject.Dispose()
    switch ($validationAlgorithm) {
      "MD5" { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
      "SHA1" { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
      "HMACSHA256" { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
      "HMACSHA385" { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
      "HMACSHA512" { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
    }
    $validationKey = BinaryToHex($validationObject.Key)
    $validationObject.Dispose()
    [string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
      "<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
      $decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
      $validationAlgorithm.ToUpperInvariant(), $validationKey)
  }
}

สำหรับ ASP.NET ๔.๐แอพลิเคชัน, คุณสามารถโทรสร้าง-machinekeyโดยไม่มีพารามิเตอร์เพื่อสร้างองค์ประกอบ < machinekey > ดังต่อไปนี้:

PS> Generate-MachineKey
<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />

ASP.NET ๒.๐และ๓.๕โปรแกรมประยุกต์ไม่สนับสนุน HMACSHA256 แต่คุณสามารถระบุ SHA1 เพื่อสร้างองค์ประกอบ < machineKey > ที่เข้ากันได้ดังนี้:

PS> Generate-MachineKey -validation sha1
<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />

ทันทีที่คุณมีองค์ประกอบ < machineKey > คุณสามารถใส่ไว้ในแฟ้ม web.config องค์ประกอบ < machineKey > จะใช้ได้เฉพาะในแฟ้ม web.config ที่รากของโปรแกรมประยุกต์ของคุณและไม่ถูกต้องในระดับโฟลเดอร์ย่อย

<configuration>
  <system.web>
    <machineKey ... />
  </system.web>
</configuration>

สำหรับรายการของอัลกอริทึมที่สนับสนุนทั้งหมดให้เรียกใช้วิธีใช้สร้าง-MachineKeyจากพร้อมต์ Windows PowerShell

ภาคผนวก B: การเตรียมใช้งานรีจิสทรีเพื่อยืนยันคีย์ที่สร้างโดยอัตโนมัติ

โดยค่าเริ่มต้นเนื่องจาก ASP คีย์สร้างโดยอัตโนมัติจะยังคงอยู่ในรีจิสทรี HKCU คีย์เหล่านี้อาจสูญหายถ้าส่วนกำหนดค่าผู้ใช้ไม่ได้ถูกโหลดลงในกระบวนการของคนงาน IIS และจากนั้นรีไซเคิลพูลโปรแกรมประยุกต์ สถานการณ์นี้อาจส่งผลกระทบต่อผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันที่กำลังเรียกใช้พูลโปรแกรมประยุกต์เป็นบัญชีผู้ใช้ Windows มาตรฐาน เพื่อหลีกเลี่ยงสถานการณ์นี้ ASP.NET ช่วยให้การยืนยันคีย์สร้างโดยอัตโนมัติในรีจิสทรี HKLM แทนที่เป็นรีจิสทรี HKCU โดยทั่วไปแล้วจะดำเนินการโดยใช้ยูทิลิตี้ aspnet_regiis (ดูคำแนะนำในส่วน "ความละเอียด 2a: ใช้ยูทิลิตี้ aspnet_regiis") อย่างไรก็ตามสำหรับผู้ดูแลที่ไม่ต้องการเรียกใช้อรรถประโยชน์นี้Windows PowerShellสคริปต์ต่อไปนี้อาจถูกใช้แทน:

# Provisions the HKLM registry so that the specified user account can persist auto-generated machine keys.
function Provision-AutoGenKeys {
  [CmdletBinding()]
  param (
    [ValidateSet("2.0", "4.0")]
    [Parameter(Mandatory = $True)]
    [string] $frameworkVersion,
    [ValidateSet("32", "64")]
    [Parameter(Mandatory = $True)]
    [string] $architecture,
    [Parameter(Mandatory = $True)]
    [string] $upn
  )
  process {
    # We require administrative permissions to continue.
    if (-Not (new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
        Write-Error "This cmdlet requires Administrator permissions."
        return
    }
    # Open HKLM with an appropriate view into the registry
    if ($architecture -eq "32") {
        $regView = [Microsoft.Win32.RegistryView]::Registry32;
    } else {
        $regView = [Microsoft.Win32.RegistryView]::Registry64;
    }
    $baseRegKey = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $regView)
    # Open ASP.NET base key
    if ($frameworkVersion -eq "2.0") {
        $expandedVersion = "2.0.50727.0"
    } else {
        $expandedVersion = "4.0.30319.0"
    }
    $aspNetBaseKey = $baseRegKey.OpenSubKey("SOFTWARE\Microsoft\ASP.NET\$expandedVersion", $True)
    # Create AutoGenKeys subkey if it doesn't already exist
    $autoGenBaseKey = $aspNetBaseKey.OpenSubKey("AutoGenKeys", $True)
    if ($autoGenBaseKey -eq $null) {
        $autoGenBaseKey = $aspNetBaseKey.CreateSubKey("AutoGenKeys")
    }
    # Get the SID for the user in question, which will allow us to get his AutoGenKeys subkey
    $sid = (New-Object System.Security.Principal.WindowsIdentity($upn)).User.Value
    # SYSTEM, ADMINISTRATORS, and the target SID get full access
    $regSec = New-Object System.Security.AccessControl.RegistrySecurity
    $regSec.SetSecurityDescriptorSddlForm("D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GA;;;$sid)")
    $userAutoGenKey = $autoGenBaseKey.OpenSubKey($sid, $True)
    if ($userAutoGenKey -eq $null) {
        # Subkey didn't exist; create and ACL appropriately
        $userAutoGenKey = $autoGenBaseKey.CreateSubKey($sid, [Microsoft.Win32.RegistryKeyPermissionCheck]::Default, $regSec)
    } else {
        # Subkey existed; make sure ACLs are correct
        $userAutoGenKey.SetAccessControl($regSec)
    }
  }
}

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการจัดเตรียมรายการรีจิสทรี HKLM ที่เหมาะสมสำหรับพูลโปรแกรมประยุกต์ที่ทำงานเป็นผู้ใช้example@contoso.com (นี่คือ UPN ของบัญชีผู้ใช้ Windows) พูลโปรแกรมประยุกต์นี้เป็นพูลโปรแกรมประยุกต์๓๒บิตที่กำลังเรียกใช้ CLR v2.0 (ASP.NET ๒.๐หรือ๓.๕)

PS> Provision-AutoGenKeys -FrameworkVersion 2.0 -Architecture 32 -UPN "example@contoso.com"

ถ้าพูลโปรแกรมประยุกต์แทนเป็นพูลโปรแกรมประยุกต์๖๔บิตที่กำลังเรียกใช้ CLR v4.0 (ASP.NET ๔.๐หรือ๔.๕) คำสั่งจะเป็นดังนี้:

PS> Provision-AutoGenKeys -FrameworkVersion 4.0 -Architecture 64 -UPN "example@contoso.com"

ถึงแม้ว่าคีย์ที่สร้างโดยอัตโนมัติจะถูกเก็บไว้ใน HKLM คีย์ย่อยของรีจิสทรีที่มีเนื้อหาการเข้ารหัสลับของแต่ละบัญชีผู้ใช้จะถูกเพิ่มลงในรายการการควบคุม access (ACL) เพื่อให้ไม่สามารถอ่านเนื้อหาที่ถูกเข้ารหัสลับโดยบัญชีผู้ใช้อื่น

ภาคผนวก C: เข้ารหัสองค์ประกอบ < machineKey > ในไฟล์การกำหนดค่า

ผู้ดูแลเซิร์ฟเวอร์อาจไม่ต้องการข้อมูลที่มีความสำคัญสูงเช่น < machineKey > วัสดุที่สำคัญในการจัดรูปแบบข้อความในแฟ้มการกำหนดค่า ถ้าเป็นกรณีนี้ผู้ดูแลระบบอาจตัดสินใจที่จะใช้ประโยชน์จากคุณลักษณะ. net framework ที่เรียกว่า "การกำหนดค่าที่ได้รับการป้องกัน" คุณลักษณะนี้ช่วยให้คุณเข้ารหัสลับบางส่วนของแฟ้ม. config ถ้าเนื้อหาของแฟ้มการกำหนดค่าเหล่านี้เคยเปิดเผยเนื้อหาส่วนเหล่านี้จะยังคงเป็นความลับ คุณสามารถค้นหาภาพรวมโดยย่อของการตั้งค่าคอนฟิกที่ได้รับการป้องกันบนเว็บไซต์ MSDN นอกจากนี้ยังมีการสอนเกี่ยวกับวิธีการป้องกัน < สตริงการเชื่อมต่อ > และ < machineKey > องค์ประกอบของแฟ้ม web.config

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ

ชุมชนช่วยให้คุณถามและตอบคําถาม ให้คําติชม และรับฟังจากผู้เชี่ยวชาญที่มีความรู้มากมาย

ข้อมูลนี้เป็นประโยชน์หรือไม่

คุณพึงพอใจกับคุณภาพภาษาเพียงใด
สิ่งที่ส่งผลต่อประสบการณ์ใช้งานของคุณ
เมื่อกดส่ง คำติชมของคุณจะถูกใช้เพื่อปรับปรุงผลิตภัณฑ์และบริการของ Microsoft ผู้ดูแลระบบ IT ของคุณจะสามารถรวบรวมข้อมูลนี้ได้ นโยบายความเป็นส่วนตัว

ขอบคุณสำหรับคำติชมของคุณ!

×