ฉันต้องการตรวจสอบความถูกต้องของชุดข้อมูลรับรองกับตัวควบคุมโดเมน เช่น:
Username: STACKOVERFLOW\joel
Password: splotchy
วิธีที่ 1. สืบค้น Active Directory ด้วยการแอบอ้างบุคคลอื่น
ผู้คนจำนวนมากแนะนำให้ค้นหา Active Directory สำหรับบางสิ่ง หากเกิดข้อยกเว้นแสดงว่าคุณทราบว่าข้อมูลรับรองไม่ถูกต้องตามที่แนะนำในคำถาม stackoverflowนี้
อย่างไรก็ตามมีข้อเสียที่ร้ายแรงบางประการสำหรับแนวทางนี้ :
คุณไม่เพียง แต่ตรวจสอบสิทธิ์บัญชีโดเมนเท่านั้น แต่คุณกำลังทำการตรวจสอบการอนุญาตโดยปริยายด้วย นั่นคือคุณกำลังอ่านคุณสมบัติจาก AD โดยใช้โทเค็นการเลียนแบบ จะเกิดอะไรขึ้นถ้าบัญชีอื่นที่ถูกต้องไม่มีสิทธิ์อ่านจาก AD? โดยค่าเริ่มต้นผู้ใช้ทุกคนมีสิทธิ์ในการอ่าน แต่สามารถตั้งค่านโยบายโดเมนเพื่อปิดใช้งานสิทธิ์การเข้าถึงสำหรับบัญชีที่ถูก จำกัด (และหรือกลุ่ม)
การเชื่อมโยงกับ AD มีค่าใช้จ่ายที่ร้ายแรงแคชสกีมาของ AD จะต้องถูกโหลดที่ไคลเอนต์ (แคช ADSI ในตัวให้บริการ ADSI ที่ใช้โดย DirectoryServices) นี่เป็นทั้งเครือข่ายและเซิร์ฟเวอร์ AD ซึ่งสิ้นเปลืองทรัพยากรและมีราคาแพงเกินไปสำหรับการดำเนินการง่ายๆเช่นการตรวจสอบบัญชีผู้ใช้
คุณอาศัยความล้มเหลวของข้อยกเว้นสำหรับกรณีที่ไม่พิเศษและสมมติว่านั่นหมายถึงชื่อผู้ใช้และรหัสผ่านไม่ถูกต้อง ปัญหาอื่น ๆ (เช่นความล้มเหลวของเครือข่ายความล้มเหลวในการเชื่อมต่อ AD ข้อผิดพลาดในการจัดสรรหน่วยความจำ ฯลฯ ) จะถูกตีความผิดพลาดเนื่องจากความล้มเหลวในการตรวจสอบสิทธิ์
วิธีที่ 2. LogonUser Win32 API
มีคนอื่นแนะนำให้ใช้LogonUser()
ฟังก์ชัน API ฟังดูดี แต่น่าเสียดายที่บางครั้งผู้ใช้โทรต้องได้รับอนุญาตจากระบบปฏิบัติการเท่านั้น
กระบวนการเรียก LogonUser ต้องการสิทธิ์ SE_TCB_NAME ถ้ากระบวนการโทรไม่มีสิทธิ์นี้ LogonUser จะล้มเหลวและ GetLastError จะส่งคืน ERROR_PRIVILEGE_NOT_HELD
ในบางกรณีกระบวนการที่เรียกใช้ LogonUser จะต้องเปิดใช้งานสิทธิ์ SE_CHANGE_NOTIFY_NAME ด้วย มิฉะนั้น LogonUser ล้มเหลวและ GetLastError ส่งคืน ERROR_ACCESS_DENIED สิทธิ์นี้ไม่จำเป็นสำหรับบัญชีระบบภายในหรือบัญชีที่เป็นสมาชิกของกลุ่มผู้ดูแลระบบ โดยค่าเริ่มต้น SE_CHANGE_NOTIFY_NAME จะเปิดใช้งานสำหรับผู้ใช้ทุกคน แต่ผู้ดูแลระบบบางคนอาจปิดใช้งานสำหรับทุกคน
แจก "การทำหน้าที่เป็นส่วนหนึ่งของระบบปฏิบัติการ " สิทธิพิเศษไม่ใช่สิ่งที่คุณต้องการจะทำจำใจ - ไมโครซอฟท์ชี้ให้เห็นในบทความฐานความรู้ :
... กระบวนการที่เรียก LogonUser ต้องมีสิทธิ์ SE_TCB_NAME (ในตัวจัดการผู้ใช้นี่คือสิทธิ์ " ทำหน้าที่เป็นส่วนหนึ่งของระบบปฏิบัติการ ") สิทธิ์ SE_TCB_NAME มีประสิทธิภาพมากและ ไม่ควรมอบให้กับผู้ใช้ใด ๆ โดยพลการเพียงเพื่อให้สามารถเรียกใช้แอปพลิเคชันที่ต้องตรวจสอบข้อมูลรับรองได้
นอกจากนี้การโทรหาLogonUser()
จะล้มเหลวหากระบุรหัสผ่านว่างไว้
วิธีที่เหมาะสมในการรับรองความถูกต้องชุดข้อมูลรับรองโดเมนคืออะไร?
ฉันเกิดขึ้นจะได้รับการเรียกร้องจากการจัดการรหัส แต่นี้เป็น AA คำถามของ Windows ทั่วไป สามารถสันนิษฐานได้ว่าลูกค้าได้ติดตั้ง. NET Framework 2.0