Xác thực trong PHP bằng LDAP thông qua Active Directory


104

Tôi đang tìm cách xác thực người dùng thông qua LDAP với PHP (với Active Directory là nhà cung cấp). Lý tưởng nhất là nó có thể chạy trên IIS 7 ( adLDAP thực hiện nó trên Apache). Bất cứ ai đã làm bất cứ điều gì tương tự, với thành công?

  • Chỉnh sửa: Tôi thích một thư viện / lớp học có mã sẵn sàng hoạt động ... Sẽ thật ngớ ngẩn khi phát minh ra bánh xe khi ai đó đã làm như vậy.

Tôi nghĩ drupal có một module cho thatr
redben

Câu trả lời:


167

Nhập toàn bộ thư viện có vẻ không hiệu quả khi tất cả những gì bạn cần về cơ bản là hai dòng mã ...

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

43
Một số cài đặt AD sẽ liên kết thành công nếu mật khẩu được cung cấp trống. Coi chừng! Bạn có thể cần đảm bảo mật khẩu không trống trước khi cố gắng xác thực.
diolemo vào

@diolemo Có cách nào để ngăn chặn điều này mà không cần kiểm tra xem mật khẩu có trống không?
Naftali aka Neal

@Neal Bạn có thể sử dụng ldap_set_optionđể làm cho nó hoạt động theo một cách khác. Có lẽ thiết lập phiên bản giao thức? Bạn sẽ phải thử nghiệm. Cá nhân tôi khuyên bạn nên kiểm tra mật khẩu trống, chỉ để an toàn.
diolemo


Đối với trình soạn thảo ẩn danh: không, theo hiểu biết của tôi, ở đây không cần phải làm sạch đầu vào cũng như ldap_bindxử lý nó và các ký tự đặc biệt không phải là vấn đề.
ceejayoz

14

Bạn sẽ nghĩ rằng chỉ cần xác thực một người dùng trong Active Directory sẽ là một quá trình khá đơn giản bằng cách sử dụng LDAP trong PHP mà không cần thư viện. Nhưng có rất nhiều thứ có thể làm phức tạp nó khá nhanh:

  • Bạn phải xác nhận đầu vào. Tên người dùng / mật khẩu trống sẽ vượt qua nếu không.
  • Bạn nên đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách khi ràng buộc.
  • Bạn nên mã hóa kết nối bằng TLS.
  • Sử dụng các máy chủ LDAP riêng biệt để dự phòng trong trường hợp một máy chủ gặp sự cố.
  • Nhận được thông báo lỗi thông tin nếu xác thực không thành công.

Trong hầu hết các trường hợp, việc sử dụng thư viện LDAP hỗ trợ điều trên thực sự dễ dàng hơn. Cuối cùng tôi đã hoàn thành thư viện của riêng mình xử lý tất cả các điểm trên: LdapTools (Chà, không chỉ để xác thực, nó có thể làm được nhiều hơn thế). Nó có thể được sử dụng như sau:

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...
}

Cuộc gọi xác thực ở trên sẽ:

  • Xác thực rằng không có tên người dùng hoặc mật khẩu nào trống.
  • Đảm bảo tên người dùng / mật khẩu được mã hóa đúng cách (UTF-8 theo mặc định)
  • Hãy thử một máy chủ LDAP thay thế trong trường hợp một máy chủ gặp sự cố.
  • Mã hóa yêu cầu xác thực bằng TLS.
  • Cung cấp thông tin bổ sung nếu không thành công (ví dụ: tài khoản bị khóa / bị vô hiệu hóa, v.v.)

Có những thư viện khác cũng làm việc này (Chẳng hạn như Adldap2). Tuy nhiên, tôi cảm thấy đủ bắt buộc phải cung cấp một số thông tin bổ sung vì câu trả lời được nhiều người bình chọn nhất thực sự là một rủi ro bảo mật dựa vào mà không thực hiện xác thực đầu vào và không sử dụng TLS.


1
Đối với các kết nối LDAP, TLS đã không được dùng nữa để thay thế cho StartTLS: openldap.org/faq/data/cache/605.html .
zenlord

2
@zenlord Không dùng ldaps://định dạng cho kết nối nữa. Trong ví dụ của tôi, khi bạn chỉ định setUseTls(true)nó sử dụng ldap://định dạng và sau đó đưa ra một StartTLS bằng cách sử dụng ldap_start_tls($connection). Vì vậy, bản thân TLS đã không bị phản đối, chỉ kết nối bằng cách sử dụng ldaps://(thực sự kết nối với LDAP qua một cổng hoàn toàn khác).
ChadSikorra

12

Tôi thực hiện việc này đơn giản bằng cách chuyển thông tin đăng nhập của người dùng đến ldap_bind ().

http://php.net/manual/en/ Chức năng.ldap-bind.php

Nếu tài khoản có thể liên kết với LDAP thì tài khoản đó hợp lệ; nếu nó không thể, nó không phải. Nếu tất cả những gì bạn đang làm là xác thực (không phải quản lý tài khoản), tôi không thấy cần thiết phải có thư viện.


9

Tôi thích Lớp Zend_Ldap , bạn chỉ có thể sử dụng lớp này trong dự án của mình mà không cần Zend Framework.


1
Tôi đã trải qua sự cố khi thực hiện những điều trên để thấy rằng đó là do việc quản lý không xác thực. Tôi định chuyển sang zend.auth.adapter.ldap
vdidxho


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.