Friday, November 19, 2010

Login User LDAP/Active Directory dengan PHP

LDAP(Lightweight Directory Access Protocol) adalah sebuah protokol aplikasi yang digunakan untuk melakukan query atau memodifikasi data layanan direktori dan diimplementasikan dalam IP(Internet Protocol). fungsi utamanya adalah untuk menyimpan semua informasi user, komputer dan sebagainya dalam satu domain. sebagai contoh jika satu komputer terdaftar pada satu domain, maka komputer tersebut dapat disetting sedemikian rupa agar dapat menggunakan user yang tersimpan pada Active Directory untuk login.



Jika aplikasi kita dapat terkoneksi dengan Active Directory, maka tidak menuntut kemungkinan kita bisa menggunakan semua user di dalamnya untuk autentikasi login. kelebihannya adalah jika ada suatu kebutuhan dimana user ingin semua orang yang menggunakan aplikasi kita didapatkan dari server Active Directory, kita tidak perlu mendaftarkan ulang semua user tersebut. System ini lebih dikenal dengan Single Sign On.

Ok, sekian dulu penjelasan mengenai LDAP. sekarang pertanyaannya adalah apakah PHP mampu melakukan koneksi ke server LDAP/Active Directory? jawabannya tentu saja adalah "YA" didalam ekstensi bawaan dari PHP sudah disediakan library untuk koneksi ke server Active Directory. berikut cara untuk mengaktifkannya :
  1. Buka file php.ini yang terdapat pada root folder php atau pada folder conf apache (jika menggunakan web server apache)
  2. Cari text ";extension=php_ldap.dll" 
  3. Jika terdapat karakter titik koma ";" seperti diatas artinya library php_ldap.dll belum diaktifkan dan belum bisa digunakan pada aplikasi kita, untuk itu hapus karakter titik koma tersebut.
  4. Save file php.ini nya, kemudian restart web server

Setelah web server direstart, maka kita siap untuk membuat aplikasi yang terkoneksi ke server Active Directory.

Sekarang mari kita buat file baru misalnya testldap.php, lalu tulis kode dibawah ini :

<?

// user dan password user yang sudah terdaftar di server LDAP
$ldaprdn  = 'uname';
$ldappass = 'mypassword';

// membuat koneksi ke server active directory
$ldapconn = ldap_connect("192.168.123.123"); // jika gagal akan mereturn value FALSE

if ($ldapconn) {
// menyatukan aplikasi dengan server LDAP
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);
// verify binding
if ($ldapbind) {
echo "Koneksi berhasil..";
} else {
echo ldap_error($ldapbind);
}
}else{
echo ldap_error($ldapconn);
}
?>

Catatan : alamat IP server bisa diganti dengan nama domain server, contoh : contohdomain.com

Jika berhasil, maka saat aplikasi dijalankan akan menampilkan pesan "User terdaftar" dan jika gagal maka akan menampilkan pesan kemungkinan error dari library LDAP. Jika user tidak dikenali maka biasanya akan mengeluarkan pesan error "Invalid Credential".

Jika sudah yakin bahwa user telah benar-benar terdaftar pada server akan tetapi masih mengeluarkan error "Invalid Credential" coba pastikan kembali format login user yang digunakan pada server. ada 3 tipe format login yang sampai sekarang sering digunakan, yaitu dengan contoh bahwa domain yang sedang kita gunakan adalah contohdomain.com:
  1. Email
    contohnya : namauser@contohdomain.com
  2. NT
    contohnya : com\contohdomain\namauser
  3. RDN
    untuk login dengan tipe RDN, kita harus tau terlebih dahulu dimana user yang akan kita gunakan disimpan di Active Directory. misalkan usernya disimpan pada OU yang bernama Users, maka format loginnya adalah sebagai berikut :
    CN=namauser,OU=Users,DC=contohdomain,DC=com
Jika penulisan usernya sudah benar, maka pada saat binding tidak akan ada error "Invalid Credential" lagi

Selamat mencoba :)

26 comments:

  1. masih gak ngerti gunanya buat apaan bro...

    ReplyDelete
  2. "Kelebihannya adalah jika ada suatu kebutuhan dimana user ingin semua orang yang menggunakan aplikasi kita didapatkan dari server Active Directory, kita tidak perlu mendaftarkan ulang semua user tersebut. System ini lebih dikenal dengan Single Sign On."

    ReplyDelete
  3. tangkyuuu berat bro untuk pencerahaannya..

    ditunggu untuk ilmu lainnya.. :)

    ReplyDelete
  4. Tidak benar LDAP itu SSO karena LDAP merupakan product single ID bukan single sign on.

    Untuk salah satu product SSO bisa dilihat www.jasig.org/cas.

    Untuk lebih jelasnya mungkin bisa dibaca disini http://www.authenticationworld.com/Single-Sign-On-Authentication/SSOandLDAP.html

    ReplyDelete
  5. Pada link yang mass camtumkan diatas justru disitu penjelasan lengkapnya mass bahwa LDAP itu sering dipakai sebagai User Directory pada kebanyakan aplikasi enterprise :)

    Setau saya SSO itu bukan produk mass, tapi metode yang dipake pada pengembangan perangkat lunak agar beberapa aplikasi dapat menggunakan satu User Directory mass seperti facebook account, google dan lain-lain :)

    ReplyDelete
  6. bos mau nanya nih kalo hostnya tu ip address komputer?di ldapnya ada yang harus dikonfigurasi lagi ga?kalo saya pas ldap_connect return valuenya bukan true ato false tapi Resource id #2 tau ga maksudnya apa?thanks b4

    ReplyDelete
  7. Itu kalau return valuenya Resource id #2 brarti koneksinya berhasil.. klo false atau kosong brarti gagal..

    koneksi berhasil sebenernya cuman sebatas pengecekan host aja dan ga bisa ambil resource apa-apa dari LDAP server.

    Saat ldap_bind itu artinya aplikasi kita kirim perintah ke LDAP Server buat authentikasi, jika user dan password terdaftar, baru bisa ambil resource dari LDAP server :)

    ReplyDelete
  8. mas saya sudah install LDAP server, sudah bisa login pake file php juga.. selanjutnya apa lagi ya? kalo misalkan saya punya 2 web aplikasi dan 1 portal aplikasi untuk login (semuanya pake php) gimana caranya saya mengautentikasi untuk 2 aplikasi web saya jika sudah berhasil login lewat portal, maksud saya jika di portal ada link ke kedua aplikasi saya, apakah bisa langsung terautentikasi tanpa login.. mohon pencerahannya...

    ReplyDelete
  9. Untuk kasus kayak gitu setau saya sih mas solusinya bisa pake Javascript/Ajax dan manipulasi "Third-party cookie".

    Misalnya portal login mas itu dibuat 1 service untuk memberi informasi login dari domain yang berbeda. terus dari domain yang lainnya mas bisa pasang javascript untuk merequest secara asynchronous ke service tersebut yang selanjutnya service tersebut akan mengembalikan "Third-party cookie" ke domain mas yang lain itu jikalau user memang sudah login di portal login.

    dan satu lagi, agar domain mas yang lain bisa mengakses portal login mas harus pake JSONP sebagai struktur datanya :)

    ReplyDelete
  10. function checkNTuser($username,$password){//v0.9
    // returns true when user/pass enable bind to LDAP (Windows 2k).
    $auth_user=$username."@".DomainName;
    #echo $auth_user."->";
    if($connect=@ldap_connect(ldap_host)){
    #echo "connection ($ldap_server): ";
    if($bind=@ldap_bind($connect, $auth_user, $password)){
    #echo "true
    ";
    @ldap_close($connect);
    return(true);
    }//if bound to ldap
    }//if connected to ldap
    #echo "failed
    ";
    @ldap_close($connect);
    return(false);
    }

    Dengan ini juga bisa, Kalau dengan methode diatas, terkadang user tidak tahu CN nya sendiri, karena CN <> givenName. dengan metodhe ini, user dapat login dengan givenName yang biasa dipakai untuk log-in ke domain/PDC

    ReplyDelete
  11. mas mohon pencerahannya lagi, saya sudah install OpenLDAP-nya, trus sudah setting seperti yang mas tutorial-kan, tetapi untuk mengetahui koneksi ldap jaan apa enggak belum bisa e. ada alamat YM atau FB ndak mas, saya mau tanya2, thanks

    ReplyDelete
  12. web server yang digunakan bisa menggunakan IIS ngga ya?

    ReplyDelete
  13. mas bro, kalo pake form login gimana code nya?

    ReplyDelete
  14. Keren mas articlenya simple dan mencerahkan, saya jadi paham langsung Fungsi LDAP itu apa plus LDPA koneksi ke PHP nya juga di kasih contoh begitu, baik sekali mas ini heheh,
    Thanks ya :D

    ReplyDelete
  15. Fatal error: Call to undefined function ldap_connect() in /home/gpibg537/public_html/21.php on line 8
    bagaiamana bisa terjadi seperti ini??

    ReplyDelete
  16. Fatal error: Call to undefined function ldap_connect() in /home/lainn049/public_html/mail/index.php on line 8

    ReplyDelete
  17. thanks mas ikhsan atas penjelasannya, bisa nambah pengetahuan :D

    ReplyDelete
  18. Dear Ikhsan.

    Itu kan menggunakan file php untuk proses login nya. Pertanyaan saya, bisa ga di dapatkan username nya ketika saya login windows,

    jadi setelah saya login windows, username akan saya lempar ke file php yang kemudian akan di cari keterangannya,

    Thanks.
    Agus S

    ReplyDelete
  19. Waahh.. Ini yang saya cari-carii... Terimakasih sekali sharenya mas..

    ReplyDelete
  20. saya belum ngerti servernya

    ReplyDelete
  21. itu klo NT user pakai subdomain bagaimana?

    ReplyDelete
  22. misal zone1.scsb.net\namafolder\namafolder2\user penulisan NT user yang benar bagaimana?

    ReplyDelete
  23. permisi mas mas semuanya mohon bantuannya yaa.
    saya ada tugas kuliah bikin web login untuk jaringan wifi yg ada dikampus. contohnya seperti wifi id, jd user harus login sebelum akses jaringan wifi.

    saya udah install ldap configurasi dan bikin database.dan saya sudah bikin web loginnya tp saya msh menggunakan php yg terkoneksi dengan database xampp yg di dalamnya admin bisa insert update delete data user.

    pertanyaannya adalah:
    1. apakah scrip php yg digunakan untuk xampp sama atau tdk dgn scrip yg digunakan untuk ldap. ?
    2. jika berbeda bagaimana cara menghubungkannya?

    terimakasih buat kaka kaka semua yg mau jawab pertanyaan dari saya. maaf kalau terlalu banyak

    ReplyDelete
  24. Bang ini gmna banggg :(

    Fatal error: Call to undefined function ldap_connect() in D:\xampp\htdocs\ldap.php on line 8

    ReplyDelete