Active Directory aracılığıyla LDAP kullanarak PHP'de kimlik doğrulama


104

Kullanıcıların kimliğini PHP ile LDAP aracılığıyla doğrulamanın bir yolunu arıyorum (sağlayıcı Active Directory ile). İdeal olarak, IIS 7'de çalışabilmelidir ( adLDAP bunu Apache'de yapar). Başarıyla benzer bir şey yapan var mı?

  • Düzenleme: Kullanılmaya hazır kodlu bir kütüphane / sınıfı tercih ederim ... Birisi bunu zaten yaptığında tekerleği icat etmek aptalca olurdu.

Drupal'ın
thatr

Yanıtlar:


167

İhtiyacınız olan tek şey aslında iki satır kod olduğunda, bütün bir kütüphaneyi içe aktarmak verimsiz görünüyor ...

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

43
Verilen parola boşsa, AD'nin bazı kurulumları başarılı bir şekilde bağlanacaktır. Buna dikkat et! Kimlik doğrulamaya çalışmadan önce boş olmayan bir parola sağlamanız gerekebilir.
diolemo

@diolemo Parolanın boş olup olmadığını kontrol etmeden bunu önlemenin bir yolu var mı?
Naftali aka Neal

@Neal ldap_set_optionFarklı bir şekilde davranmasını sağlamak için kullanabilirsiniz . Belki de protokol sürümünü ayarlıyor musunuz? Denemeniz gerekecek. Kişisel olarak, güvenliğiniz için, yine de boş bir şifre kontrol etmenizi öneririm.
diolemo


Anonim editöre: hayır, benim bildiğim ldap_bindkadarıyla burada girdi temizliği, onu idare edeceği için gerekli değildir ve özel karakterler bir sorun değildir.
ceejayoz

14

Active Directory'de bir kullanıcının kimliğini doğrulamanın, bir kitaplığa ihtiyaç duymadan PHP'de LDAP kullanarak oldukça basit bir işlem olacağını düşünürdünüz. Ancak bunu oldukça hızlı bir şekilde karmaşıklaştırabilecek pek çok şey var:

  • Girişi doğrulamalısınız. Aksi takdirde boş bir kullanıcı adı / şifre geçecektir.
  • Bağlama sırasında kullanıcı adı / parolanın doğru şekilde kodlandığından emin olmalısınız.
  • TLS kullanarak bağlantıyı şifrelemelisiniz.
  • Bir arıza durumunda yedeklilik için ayrı LDAP sunucuları kullanmak.
  • Kimlik doğrulama başarısız olursa bilgilendirici bir hata mesajı almak.

Çoğu durumda yukarıdakileri destekleyen bir LDAP kitaplığı kullanmak aslında daha kolaydır. Sonunda, yukarıdaki tüm noktaları ele alan kendi kütüphanemi yuvarladım : LdapTools (Sadece kimlik doğrulama için değil, çok daha fazlasını yapabilir). Aşağıdaki gibi kullanılabilir:

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

Yukarıdaki kimlik doğrulama çağrısı:

  • Kullanıcı adı veya parolanın boş olmadığını doğrulayın.
  • Kullanıcı adı / parolanın doğru şekilde kodlandığından emin olun (varsayılan olarak UTF-8)
  • Çalışmama ihtimaline karşı alternatif bir LDAP sunucusu deneyin.
  • TLS kullanarak kimlik doğrulama isteğini şifreleyin.
  • Başarısız olursa ek bilgi sağlayın (ör. Kilitli / devre dışı bırakılmış hesap, vb.)

Bunu yapacak başka kütüphaneler de var (Adldap2 gibi). Bununla birlikte, en çok oylanan yanıt, TLS kullanmadan ve hiçbir giriş doğrulaması yapılmadan güvenilecek bir güvenlik riski olduğundan, bazı ek bilgiler sağlamak için kendimi yeterince mecbur hissettim.


1
LDAP bağlantıları için TLS, StartTLS lehine kullanımdan kaldırılmıştır: openldap.org/faq/data/cache/605.html .
zenlord

2
@zenlord ldaps://Bağlantı için format kullanımı önerilmiyor. Örneğimde setUseTls(true), ldap://biçim kullandığını belirttiğinizde ve ardından ldap_start_tls($connection). Dolayısıyla TLS'nin kendisi kullanımdan kaldırılmadı, sadece kullanarak bağlanmak ldaps://(aslında LDAP'ye tamamen farklı bir bağlantı noktası üzerinden bağlanır).
ChadSikorra

12

Bunu sadece kullanıcı kimlik bilgilerini ldap_bind () 'e geçirerek yapıyorum.

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

Hesap LDAP'ye bağlanabilirse, geçerlidir; yapamazsa, değildir. Tek yaptığınız kimlik doğrulama ise (hesap yönetimi değil), bir kitaplığa ihtiyaç olduğunu görmüyorum.




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.