การแก้ไขปัญหาการรับรองความถูกต้องของฟอร์ม


คอลัมน์เสียงสนับสนุนของ.NET ASP


การแก้ไขปัญหาการรับรองความถูกต้องของฟอร์ม

เมื่อต้องการกำหนดคอลัมน์นี้กับความต้องการของคุณ เราต้องเชิญคุณสามารถส่งแนวคิดของคุณเกี่ยวกับหัวข้อที่สนใจของคุณและการตัดสินค้าจากคลังที่คุณต้องการดู ได้รับการจัดการในอนาคตบทความในฐานความรู้และคอลัมน์เสียงสนับสนุน คุณสามารถส่งความคิดและคำติชมโดยใช้แบบฟอร์มสอบถามสำหรับแฟ้มของคุณ นอกจากนี้ยังมีการเชื่อมโยงไปยังแบบฟอร์มที่ด้านล่างของคอลัมน์นี้
ยินดีต้อนรับสู่คอลัมน์เสียงสนับสนุน ASP.NET ชื่อของฉันคือ Jerry Orman ฉันได้กับ Microsoft เกิน 5 ปี และใช้เวลาของฉันมุ่งเน้นเทคโนโลยีที่เกี่ยวข้องกับเว็บเช่น Microsoft FrontPage และเทคโนโลยี Microsoft SharePoint ใหม่ส่วนใหญ่ ฉันได้ใช้ปีสุดท้ายที่ทำงานกับ Microsoft ASP.NET เป็นวิศวกรฝ่ายสนับสนุน เดือนนี้ในคอลัมน์เสียงสนับสนุน ที่จะอธิบายถึงวิธีการแก้ไขปัญหาการรับรองความถูกต้องของแบบฟอร์มใน Microsoft ASP.NET

การแก้ไขปัญหาการรับรองความถูกต้องของฟอร์ม


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

ในคอลัมน์นี้ เราจะครอบคลุมแนวคิดเกี่ยวกับการรับรองความถูกต้องของฟอร์มสั้น ๆ แล้วเราจะมีลักษณะเป็นสถานการณ์สมมติที่ทำให้ผู้ใช้มีการเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบและวิธีการจัดให้มีข้อมูลที่เกี่ยวข้องกับการแยกปัญหา นอกจากนี้เรายังจะครอบคลุมวิธีการใช้อินเทอร์เฟซของ IHttpModule เมื่อต้องการบันทึกข้อมูลการรับรองความถูกต้องของฟอร์ม

ภาพรวมการรับรองความถูกต้องของฟอร์ม

เมื่อผู้ใช้รับรองความถูกต้องไปยังเว็บไซต์ โดยใช้การรับรองความถูกต้องของฟอร์ม เซิร์ฟเวอร์ที่สร้างคุกกี้ ค่าของคุกกี้คือ บัตรการรับรองความถูกต้องแบบฟอร์มที่เข้ารหัสลับ คุกกี้จะถูกส่งผ่านไปยังเซิร์ฟเวอร์ในการร้องขอแต่ละแอพลิเคชัน และคลาFormsAuthenticationModule decrypts ค่าคุกกี้ และกำหนดว่า ผู้ใช้ที่ถูกต้อง หรือไม่

โดยค่าเริ่มต้น คลาFormsAuthenticationModuleถูกเพิ่มในไฟล์ Machine.config คลาFormsAuthenticationModuleการจัดการกระบวนการ FormsAuthentication

ต่อไปนี้คือ รายการจากแฟ้ม Machine.config:
<httpModule>     …other modules…
<add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule" />
…other modules…
</httpModule>

รับส่งข้อมูล HTTP ทั่วไปสำหรับการรับรองความถูกต้องโดยใช้การรับรองความถูกต้องของแบบฟอร์มมีลักษณะคล้ายกับต่อไปนี้:
  1. ไคลเอ็นต์ส่ง HTTP ได้รับการ Default.aspx ไม่มีคุกกี้รับรองความถูกต้องของฟอร์มจะถูกส่ง
  2. เซิร์ฟเวอร์ส่งการตอบสนอง 302 (เปลี่ยนเส้นทาง) ที่ Login.aspx
  3. ไคลเอนต์ส่ง HTTP POST ผิดไป Login.aspx ซึ่งจะรวมถึงข้อมูลการเข้าสู่ระบบ
  4. เซิร์ฟเวอร์ส่งการตอบสนอง 302 (เปลี่ยนเส้นทาง) ที่ Default.aspx คุกกี้การรับรองความถูกต้องแบบฟอร์มจะรวมอยู่ด้วย
  5. ไคลเอ็นต์ส่ง HTTP ได้รับการ Default.aspx ซึ่งรวมถึงคุกกี้รับรองความถูกต้องของฟอร์ม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ และการใช้การรับรองความถูกต้องของฟอร์ม แวะไปที่เว็บไซต์ต่อไปนี้:สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุกกี้การรับรองความถูกต้องของฟอร์มที่ใช้งานร่วมกัน เยี่ยมชม ASP.NET เว็บไซต์ต่อไปนี้:

เหตุผลที่ว่า ผู้ใช้อาจถูกเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบ

คุกกี้การรับรองความถูกต้องแบบฟอร์มหายไป

สถานการณ์สมมติที่ 1

ในสถานการณ์สมมตินี้ ผู้ใช้ล็อกออนที่เว็บไซต์ ในบางกรณี ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ และ
คลาFormsAuthenticationModuleไม่ได้รับคุกกี้ คุณสามารถกำหนดว่าถ้าคำขอของผู้ใช้ไม่ประกอบด้วยคุกกี้เปิดใช้งานการเข้าสู่ระบบใน Microsoft Internet Information Services (IIS) ของคุกกี้ เมื่อต้องการทำเช่นนี้ ให้ทำตามขั้นตอนเหล่านี้:
  1. เปิดที่ IIS Microsoft Management Console (MMC)
  2. คลิกขวาเว็บไซต์ แล้ว คลิ ก
    คุณสมบัติ
  3. คลิกที่แท็บเว็บไซต์แล้ว คลิ กเปิดใช้งานการเข้าสู่ระบบ
  4. ตรวจสอบให้แน่ใจว่า รูปแบบแฟ้มบันทึกW3C ขยายรูปแบบแฟ้มบันทึก
  5. คลิก คุณสมบัติ
  6. คลิกแท็บขั้นสูงและคลิก
    คุณสมบัติเพิ่มเติม
  7. ภายใต้คุณสมบัติที่ขยายคลิกเพื่อเลือกกล่องกาเครื่องหมายCookie(cs(Cookie))และReferer (cs(Referer))กล่องกาเครื่องหมาย
หลังจากที่ปัญหานี้เกิดขึ้น กำหนดไคลเอนต์ใดที่มีปัญหาและที่อยู่ IP ของไคลเอ็นต์ กรองบันทึก IIS บนที่อยู่ IP ของไคลเอนต์ และดูคอลัมน์ <คุกกี้>

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

นี่เป็นการเข้าสู่ระบบเริ่มต้น
วิธีการหน้าการตอบสนองคุกกี้
รับ/Default.aspx302 (เปลี่ยนเส้นทาง)ไม่มีคุกกี้
รับ/Login.aspx200 (สำเร็จ)ไม่มีคุกกี้
ประกาศ/Login.aspx302 (เปลี่ยนเส้นทาง)ไม่มีคุกกี้
รับ/Default.aspx200 (สำเร็จ).ASPXAUTH
รับ/SomePage.aspx302 (เปลี่ยนเส้นทาง)ไม่ใช่ ASPXAUTH คุกกี้
เหล่านี้คือคำขออื่น ๆ ตาม ด้วยการร้องขอไปยังหน้าบนไซต์ได้โดยไม่ต้องการ ASPXAUTH คุกกี้
วิธีการหน้าการตอบสนองคุกกี้
รับ/SomePage.aspx302 (เปลี่ยนเส้นทาง)ไม่ใช่ ASPXAUTH คุกกี้
รับ/Login.aspx200 (สำเร็จ)ไม่ใช่ ASPXAUTH คุกกี้
ประกาศ/Login.aspx302 (เปลี่ยนเส้นทาง)ไม่ใช่ ASPXAUTH คุกกี้
รับ/SomePage.aspx200 (สำเร็จ).ASPXAUTH

หมายเหตุ การร้องขอแรกจากผู้ใช้ที่ไม่น่าจะมีคุกกี้รับรองความถูกต้องแบบฟอร์มยกเว้นว่าคุณกำลังสร้างคุกกี้แบบถาวร บันทึก IIS จะแสดงเฉพาะคุณคุกกี้ที่ได้รับในการร้องขอ การร้องขอแรกมีคุกกี้การรับรองความถูกต้องแบบฟอร์มจะเปิดคำขอหลังจากความพยายามเข้าสู่ระบบเรียบร้อยแล้ว
สถานการณ์สมมติ 2

คุกกี้การรับรองความถูกต้องแบบฟอร์มยังอาจหายไปเมื่อเกินขีดจำกัดของคุกกี้ของไคลเอ็นต์ ใน Microsoft Internet Explorer มีขีดจำกัดของคุกกี้ 20 หลังจากสร้างคุกกี้ 000520-345 บนไคลเอนต์ คุกกี้ก่อนหน้าจะถูกเอาออกจากคอลเลกชันของไคลเอ็นต์ ถ้าอยู่ ASPXAUTH คุกกี้จะถูกลบออก ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบเมื่อมีการประมวลผลการร้องขอถัดไป

คุณสามารถแก้ไขสถานการณ์สมมติสองเหล่านี้ได้ในลักษณะเดียวกัน ค้นหาที่ร้องขอการเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบก่อน หากการร้องขอไปยังเพจนี้สร้างคุกกี้ ซึ่งจะมีบางสิ่งบางอย่างเพื่อตรวจสอบ

สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

306070จำนวนและขนาดจำกัดของคุกกี้ใน Internet Explorer


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

เมื่อต้องการดาวน์โหลด Fiddler เยี่ยมชม Fiddler เว็บไซต์ต่อไปนี้:
สถานการณ์สมมติ 3

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

การร้องขอของไคลเอ็นต์

นี่คือคำขอรับหลังจากที่ผู้ใช้ได้รับการรับรอง ข้อมูลบัตรการรับรองความถูกต้องแบบฟอร์มจะถูกเน้นเป็นสีน้ำเงิน ยืนยันว่า ข้อมูลคุกกี้ออกจากไคลเอนต์ เมื่อคุณใช้จับเครื่องมือเครือข่าย เช่น Netmon คุณเห็นปริมาณการใช้งานที่จริง ไปถึงอะแดปเตอร์
47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61 gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63 spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53 che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30 PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36 C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46 9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35 51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46 81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34 24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39 B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46 9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43 BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46 2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65 4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62 =VisitorId=b24eb

ขอฝั่งเซิร์ฟเวอร์

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

หมายเหตุ นอกจากนี้ยังมีอินสแตนซ์ของตัวกรอง ISAPI เอาคุกกี้ ถ้าคุณยืนยันว่า เว็บเซิร์ฟเวอร์ได้รับคุกกี้ แต่ไม่มีอยู่ในแฟ้มบันทึก IIS คุกกี้ ตรวจสอบตัวกรอง ISAPI คุณอาจต้องเอาตัวกรองเมื่อต้องการดูถ้าจะแก้ปัญหา

บัตรการรับรองความถูกต้องของฟอร์มหมดเวลา

สาเหตุทั่วไปอื่น ๆ สำหรับผู้ใช้ที่จะถูกเปลี่ยนเส้นทางคือ ถ้าบัตรการรับรองความถูกต้องของฟอร์มหมดอายุแล้ว บัตรการรับรองความถูกต้องของฟอร์มสามารถหมดเวลาสองวิธี สถานการณ์สมมติแรกเกิดขึ้นถ้าคุณใช้หมดอายุสัมบูรณ์ มีวันหมดอายุสัมบูรณ์ บัตรการรับรองความถูกต้องหมดอายุเมื่อหมดเวลาหมดอายุ ตัวอย่างเช่น คุณตั้งค่าวันหมดอายุเป็น 20 นาที และผู้เยี่ยมชมไซต์ที่ 2:00 น. ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบถ้าผู้เยี่ยมชมไซต์หลังจาก 2:20 PM

ถ้าคุณใช้แถบเลื่อนหมดอายุ สถานการณ์จำลองเป็นเรื่องยุ่งยากมากกว่าสักเล็กน้อย คุกกี้และตั๋วโดยสารเป็นผลลัพธ์ถูกปรับปรุงถ้าผู้เยี่ยมชมไซต์หลังจากเวลาหมดอายุจะหมดอายุครึ่ง ตัวอย่าง คุณตั้งค่าวันหมดอายุที่ 20 นาที โดยใช้แถบเลื่อนหมดอายุ ผู้เยี่ยมชมไซต์ที่ 2:00 น. และผู้ใช้ได้รับคุกกี้ที่ถูกตั้งค่าให้หมดอายุเวลา 2:20 PM การหมดอายุเท่านั้นได้รับการปรับปรุงถ้าผู้เยี่ยมชมไซต์หลังจาก 2:10 PM ถ้าผู้เยี่ยมชมไซต์ที่ 2:09 PM ตั๋วโดยสารจะไม่ปรับปรุงเนื่องจากครึ่งหนึ่งของเวลาหมดอายุไม่ผ่าน ถ้าผู้ใช้แล้วรอ 12 นาที การเยี่ยมชมไซต์ที่ 2:21 PM ระบบจะหมดอายุตั๋วโดยสาร ผู้ใช้ถูกเปลี่ยนเส้นทางไปยังหน้าการเข้าสู่ระบบ

วิธีหนึ่งในวิธีการนี้ชนิดของปัญหาที่เป็นการ เข้าสู่ฟอร์มคุกกี้และบัตรข้อมูล ด้วยวิธีนี้ คุณสามารถดูถ้าคุกกี้ได้รับ โดย IIS และค่าเหล่านั้น คุณสามารถทำเช่นนี้ได้ โดยการเขียนผิดHttpModuleแล้ว เสียบโมดูลนั้นไปป์ไลน์การร้องขอ คุณจะไม่ได้มีการปรับเปลี่ยนรหัสโปรแกรมประยุกต์ของคุณเพื่อรับข้อมูลที่คุณต้องการ

ตัวอย่างแนบมาทำงานใน Microsoft .NET Framework 1.1 และ.NET Framework 2.0 และมีข้อคิดเห็นทั้งหมด ตัวอย่างประกอบด้วยแฟ้มต่อไปนี้:หมายเหตุฉันจะให้การเชื่อมโยงดาวน์โหลดสำหรับรหัสที่ระบุในแฟ้ม FormsAuthLogger.zip

ฉันจะชี้ออกพื้นที่หลักที่นี่:

เป็นเสมอ รู้สึกฟรีเพื่อส่งความคิดเห็นบนหัวข้อคุณต้องได้รับการจัดการในอนาคตคอลัมน์ หรือ ในฐานข้อมูลองค์ความรู้ใช้ใน
ขอให้สำหรับนั้นแบบฟอร์ม