การพิสูจน์ตัวตนใน PHP โดยใช้ LDAP ผ่าน Active Directory


105

ฉันกำลังมองหาวิธีตรวจสอบสิทธิ์ผู้ใช้ผ่าน LDAP ด้วย PHP (โดยมี Active Directory เป็นผู้ให้บริการ) ตามหลักการแล้วควรจะสามารถทำงานบน IIS 7 ได้ ( adLDAP ทำงานบน Apache) ใครเคยทำอะไรที่คล้ายกันประสบความสำเร็จ?

  • แก้ไข: ฉันต้องการห้องสมุด / ชั้นเรียนที่มีรหัสที่พร้อมใช้งาน ... มันคงโง่ที่จะประดิษฐ์วงล้อเมื่อมีคนทำไปแล้ว

ฉันคิดว่า drupal มีโมดูลสำหรับ
นั่น

คำตอบ:


169

การนำเข้าไลบรารีทั้งหมดดูเหมือนจะไม่มีประสิทธิภาพเมื่อสิ่งที่คุณต้องการคือโค้ดสองบรรทัด ...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}

44
การติดตั้ง AD บางอย่างจะผูกได้สำเร็จหากรหัสผ่านที่ระบุว่างเปล่า ระวังนี้! คุณอาจต้องแน่ใจว่ารหัสผ่านไม่ว่างเปล่าก่อนที่จะพยายามตรวจสอบสิทธิ์
diolemo

@diolemo มีวิธีใดในการป้องกันโดยไม่ตรวจสอบว่ารหัสผ่านว่างเปล่า?
Naftali aka Neal

1
@Neal คุณอาจสามารถใช้ldap_set_optionเพื่อทำให้มันทำงานในลักษณะอื่นได้ อาจตั้งค่าเวอร์ชันโปรโตคอล? คุณจะต้องทดลอง ฉันขอแนะนำให้คุณตรวจสอบรหัสผ่านที่ว่างเปล่าเป็นการส่วนตัวเพื่อความปลอดภัย
diolemo


สำหรับผู้แก้ไขที่ไม่ระบุตัวตน: ไม่สำหรับความรู้ของฉันการฆ่าเชื้อที่ป้อนข้อมูลไม่จำเป็นต้องมีที่นี่เช่นเดียวกับการldap_bindจัดการมันและอักขระพิเศษก็ไม่ใช่ปัญหา
ceejayoz

14

คุณคิดว่าการพิสูจน์ตัวตนผู้ใช้ใน 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


1
สำหรับการเชื่อมต่อ LDAP, TLS ได้เลิกในความโปรดปรานของ STARTTLS: openldap.org/faq/data/cache/605.html
zenlord

2
@zenlord การใช้ldaps://รูปแบบสำหรับการเชื่อมต่อนั้นเลิกใช้แล้ว ในตัวอย่างของฉันเมื่อคุณระบุsetUseTls(true)ให้ใช้ldap://รูปแบบแล้วออก StartTLS โดยใช้ldap_start_tls($connection). ดังนั้น TLS จึงไม่ถูกเลิกใช้เพียงแค่เชื่อมต่อโดยใช้ldaps://(ซึ่งจริงๆแล้วเชื่อมต่อกับ LDAP ผ่านพอร์ตที่แตกต่างกันโดยสิ้นเชิง)
ChadSikorra

12

ฉันทำได้ง่ายๆโดยส่งข้อมูลรับรองผู้ใช้ไปที่ ldap_bind ()

http://php.net/manual/en/function.ldap-bind.php

หากบัญชีสามารถผูกกับ LDAP ได้แสดงว่าถูกต้อง ถ้าทำไม่ได้ก็ไม่ใช่ หากสิ่งที่คุณทำคือการตรวจสอบสิทธิ์ (ไม่ใช่การจัดการบัญชี) ฉันไม่เห็นความจำเป็นในการใช้ห้องสมุด


9

ฉันชอบคลาสZend_Ldapคุณสามารถใช้ได้เฉพาะคลาสนี้ในโปรเจ็กต์ของคุณโดยไม่ต้องใช้ Zend Framework


1
ฉันประสบปัญหาในการใช้งานข้างต้นเพื่อพบว่ามีการจัดการการไม่รับรองความถูกต้อง ฉันตั้งใจจะเปลี่ยนไปใช้zend.auth.adapter.ldap
vdidxho

6

PHP มีไลบรารี: http://ca.php.net/ldap

PEAR ยังมีแพ็คเกจอีกมากมาย: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

ฉันไม่ได้ใช้อย่างใดอย่างหนึ่ง แต่ฉันกำลังจะไปถึงจุดหนึ่งและดูเหมือนว่าพวกเขาจะได้ผล


5

สำหรับผู้ที่กำลังมองหาตัวอย่างที่สมบูรณ์โปรดดูที่http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/

ฉันได้ทดสอบการเชื่อมต่อกับตัวควบคุมโดเมนทั้ง Windows Server 2003 และ Windows Server 2008 R2 จาก Windows Server 2003 Web Server (IIS6) และจาก Windows Server 2012 Enterprise ที่เรียกใช้ IIS 8

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.