सक्रिय निर्देशिका के माध्यम से LDAP का उपयोग करके PHP में प्रमाणीकरण


104

मैं PHP के साथ LDAP के माध्यम से उपयोगकर्ताओं को प्रमाणित करने का एक तरीका ढूंढ रहा हूं (सक्रिय निर्देशिका प्रदाता होने के साथ)। आदर्श रूप से, यह IIS 7 पर चलने में सक्षम होना चाहिए ( adLDAP इसे Apache पर करता है)। किसी ने भी कुछ ऐसा ही किया था, सफलता के साथ?

  • संपादित करें: मैं कोड के साथ एक पुस्तकालय / कक्षा पसंद करूंगा जो जाने के लिए तैयार है ... पहिया को आविष्कार करने के लिए यह मूर्खतापूर्ण होगा जब कोई पहले से ही ऐसा कर चुका हो।

मुझे लगता है कि ड्रुपल के पास थेटर के लिए एक मॉड्यूल है
पुनः डिज़ाइन करें

जवाबों:


167

एक संपूर्ण पुस्तकालय आयात करना अक्षम लगता है जब आपको आवश्यक सभी आवश्यक रूप से कोड की दो लाइनें होती हैं ...

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

43
यदि पासवर्ड दिया गया है, तो AD की कुछ संस्थापनाएं सफलतापूर्वक बंध जाएंगी। इसके लिए बाहर देखो! प्रमाणित करने का प्रयास करने से पहले आपको एक गैर-खाली पासवर्ड सुनिश्चित करना होगा।
diolemo

अगर पासवर्ड खाली है तो क्या बिना जाँच के इसे रोकने का कोई तरीका है @diolemo?
नैफटली उर्फ ​​नील

@ नील आप ldap_set_optionइसे एक अलग तरीके से व्यवहार करने के लिए उपयोग करने में सक्षम हो सकते हैं । शायद प्रोटोकॉल संस्करण की स्थापना? आपको प्रयोग करना पड़ेगा। मैं व्यक्तिगत रूप से आपको सुझाव दूंगा कि आप किसी भी खाली पासवर्ड की जांच करें, बस सुरक्षित रहने के लिए।
डिओलेमो


अनाम संपादक के लिए: नहीं, मेरे ज्ञान के लिए, इनपुट सैनिटाइजेशन की यहां आवश्यकता नहीं है क्योंकि ldap_bindइसे संभालना होगा और विशेष वर्ण कोई समस्या नहीं हैं।
सियजयोज़ '

14

आपको लगता है कि बस एक सक्रिय निर्देशिका में एक उपयोगकर्ता को प्रमाणित करने के लिए एक पुस्तकालय की आवश्यकता के बिना PHP में LDAP का उपयोग करते हुए एक बहुत ही सरल प्रक्रिया होगी। लेकिन बहुत सी चीजें हैं जो इसे बहुत तेजी से जटिल कर सकती हैं:

  • आपको इनपुट को मान्य करना होगा। एक खाली उपयोगकर्ता नाम / पासवर्ड अन्यथा पास होगा।
  • आपको यह सुनिश्चित करना चाहिए कि बाध्यकारी करते समय उपयोगकर्ता नाम / पासवर्ड ठीक से एन्कोडेड है।
  • आपको टीएलएस का उपयोग करके कनेक्शन को एन्क्रिप्ट करना चाहिए।
  • यदि कोई डाउन है तो अतिरेक के लिए अलग 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)
  • वैकल्पिक एलडीएपी सर्वर एक के नीचे होने की स्थिति में प्रयास करें।
  • टीएलएस का उपयोग करके प्रमाणीकरण अनुरोध को एन्क्रिप्ट करें।
  • यदि यह विफल (यानी बंद / अक्षम खाता, आदि) अतिरिक्त जानकारी प्रदान करें

ऐसा करने के लिए अन्य पुस्तकालय भी हैं (जैसे कि Adldap2)। हालांकि, मैंने कुछ अतिरिक्त जानकारी प्रदान करने के लिए पर्याप्त मजबूर महसूस किया क्योंकि सबसे अधिक मतदान का जवाब वास्तव में एक सुरक्षा जोखिम है जिस पर कोई इनपुट सत्यापन नहीं किया गया है और टीएलएस का उपयोग नहीं किया गया है।


1
LDAP कनेक्शन के लिए, TLS को StartTLS: openldap.org/faq/data/cache/605.html के पक्ष में हटा दिया गया है ।
ज़ेनलॉर्ड

2
@zenlord ldaps://कनेक्शन के लिए प्रारूप का उपयोग करना पदावनत है। मेरे उदाहरण में, जब आप setUseTls(true)इसे निर्दिष्ट करते हैं तो यह ldap://प्रारूप का उपयोग करता है और फिर एक StartTLS का उपयोग करके जारी करता है ldap_start_tls($connection)। इसलिए टीएलएस को ही अपदस्थ नहीं किया गया है, केवल कनेक्ट करने का उपयोग कर रहा है ldaps://(जो वास्तव में पूरी तरह से अलग पोर्ट पर LDAP से जुड़ता है)।
चादसिकोरा

12

मैं इसे केवल ldap_bind () के लिए उपयोगकर्ता क्रेडेंशियल्स पास करके करता हूं।

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

यदि खाता LDAP से जुड़ सकता है, तो यह वैध है; अगर यह नहीं हो सकता, यह नहीं है। यदि आप सब कर रहे हैं तो प्रमाणीकरण (खाता प्रबंधन नहीं), मुझे लाइब्रेरी की आवश्यकता नहीं है।


9

मुझे Zend_Ldap क्लास पसंद है , आप अपने प्रोजेक्ट में केवल Zend फ्रेमवर्क के बिना ही इस क्लास का उपयोग कर सकते हैं।


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/ देखें

मैंने इसे Windows Server 2003 वेब सर्वर (IIS6) से और Windows Server 2012 एंटरप्राइज़ IIS 8 से चलने वाले Windows Server 2003 से Windows Server 2003 और Windows Server 2008 R2 डोमेन नियंत्रकों दोनों से कनेक्ट किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.