คุณคิดว่าการพิสูจน์ตัวตนผู้ใช้ใน Active Directory จะเป็นกระบวนการที่ค่อนข้างง่ายโดยใช้ LDAP ใน PHP โดยไม่ต้องใช้ไลบรารี แต่มีหลายสิ่งที่สามารถทำให้มันซับซ้อนได้อย่างรวดเร็ว:
- คุณต้องตรวจสอบการป้อนข้อมูล ชื่อผู้ใช้ / รหัสผ่านที่ว่างเปล่าจะผ่านไปได้
- คุณควรตรวจสอบให้แน่ใจว่ามีการเข้ารหัสชื่อผู้ใช้ / รหัสผ่านอย่างถูกต้องเมื่อผูก
- คุณควรเข้ารหัสการเชื่อมต่อโดยใช้ TLS
- การใช้เซิร์ฟเวอร์ LDAP แยกต่างหากสำหรับความซ้ำซ้อนในกรณีที่เซิร์ฟเวอร์ล่ม
- รับข้อความแสดงข้อผิดพลาดหากการรับรองความถูกต้องล้มเหลว
ในกรณีส่วนใหญ่การใช้ไลบรารี LDAP ที่รองรับข้างต้นนั้นง่ายกว่า ในที่สุดฉันก็เปิดไลบรารีของตัวเองซึ่งจัดการกับประเด็นข้างต้นทั้งหมด: LdapTools (ไม่ใช่แค่การตรวจสอบสิทธิ์เท่านั้น แต่ยังสามารถทำอะไรได้อีกมากมาย) สามารถใช้งานได้ดังต่อไปนี้:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
การเรียกตรวจสอบสิทธิ์ข้างต้นจะ:
- ตรวจสอบว่าชื่อผู้ใช้หรือรหัสผ่านไม่ว่างเปล่า
- ตรวจสอบว่ามีการเข้ารหัสชื่อผู้ใช้ / รหัสผ่านอย่างถูกต้อง (UTF-8 โดยค่าเริ่มต้น)
- ลองใช้เซิร์ฟเวอร์ LDAP อื่นในกรณีที่เซิร์ฟเวอร์ไม่ทำงาน
- เข้ารหัสคำขอรับรองความถูกต้องโดยใช้ TLS
- ให้ข้อมูลเพิ่มเติมหากล้มเหลว (เช่นบัญชีถูกล็อก / ปิดใช้งาน ฯลฯ )
มีไลบรารีอื่น ๆ ให้ทำเช่นกัน (เช่น Adldap2) อย่างไรก็ตามฉันรู้สึกว่าถูกบังคับมากพอที่จะให้ข้อมูลเพิ่มเติมเนื่องจากคำตอบที่ได้รับการโหวตมากที่สุดนั้นเป็นความเสี่ยงด้านความปลอดภัยที่ต้องพึ่งพาโดยไม่มีการตรวจสอบอินพุตและไม่ได้ใช้ TLS