2013-04-23 4 views
8

मैं एक क्लाइंट ऐप लिख रहा हूं (OpenLDAP लाइब्रेरीज़ का उपयोग करके) जिसके लिए उपयोगकर्ता एलडीएपी सर्वर के माध्यम से प्रमाणित हो जाते हैं।एलडीएपी का उपयोग कर उपयोगकर्ता के लिए पासवर्ड प्रमाणीकरण कैसे करें?

यहां नमूना, हार्ड कोडित, प्रोग्राम है जो उपयोगकर्ता के लिए उपयोगकर्ता पासवर्ड की तुलना करने में विफल रहता है।

#include <stdio.h> 
#include <ldap.h> 
#define LDAP_SERVER "ldap://192.168.1.95:389" 

int main(int argc, char **argv){ 
    LDAP  *ld; 
    int   rc; 
    char  bind_dn[100]; 
    LDAPMessage *result, *e; 
    char *dn; 
    int has_value; 

    sprintf(bind_dn, "cn=%s,dc=ashwin,dc=com", "manager"); 
    printf("Connecting as %s...\n", bind_dn); 

    if(ldap_initialize(&ld, LDAP_SERVER)) 
    { 
     perror("ldap_initialize"); 
     return(1); 
    } 

    rc = ldap_simple_bind_s(ld, bind_dn, "ashwin"); 
    if(rc != LDAP_SUCCESS) 
    { 
     fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc)); 
     return(1); 
    } 

    printf("Successful authentication\n"); 

    rc = ldap_search_ext_s(ld, "dc=ashwin,dc=com", LDAP_SCOPE_SUBTREE, "sn=ashwin kumar", NULL, 0, NULL, NULL, NULL, 0, &result); 
    if (rc != LDAP_SUCCESS) { 
     fprintf(stderr, "ldap_search_ext_s: %s\n", ldap_err2string(rc)); 
    } 

    for (e = ldap_first_entry(ld, result); e != NULL; e = ldap_next_entry(ld, e)) { 
     if ((dn = ldap_get_dn(ld, e)) != NULL) { 
      printf("dn: %s\n", dn); 
      has_value = ldap_compare_s(ld, dn, "userPassword", "secret"); 
      switch (has_value) { 
       case LDAP_COMPARE_TRUE: 
        printf("Works.\n"); 
        break; 
       case LDAP_COMPARE_FALSE: 
        printf("Failed.\n"); 
        break; 
       default: 
        ldap_perror(ld, "ldap_compare_s"); 
        return(1); 
      } 
      ldap_memfree(dn); 
     } 
    } 

    ldap_msgfree(result); 
    ldap_unbind(ld); 
    return(0); 
} 

userPassword अगर यह LDAP सर्वर में सादा है, यह काम करता है। वही पासवर्ड अगर यह MD5 एन्क्रिप्टेड है, ldap_compare_s विफल रहता है। और ऐसा इसलिए है क्योंकि मैं तुलना करने के लिए cleartext पासवर्ड गुजर रहा हूँ।

मैं इस नमूना कार्यक्रम को कैसे काम कर सकता हूं?

क्या मैं यह सही कर रहा हूं? क्या एलडीएपी के माध्यम से उपयोगकर्ता को प्रमाणित करने के लिए ldap_compare_s का उपयोग करना सही है?

पीएस: यह पहली बार है जब मैं एलडीएपी पर काम कर रहा हूं।

उत्तर

7

एलडीएपी पर पासवर्ड जांच करने का यह सही तरीका नहीं है, आपको क्या करना चाहिए, पहली खोज और प्राप्त पासवर्ड से प्राप्त dn का उपयोग करके बाध्य करने का प्रयास करना है।

यानी आप पासवर्ड सत्यापित करने के लिए दूसरा बाध्य करते हैं। यदि बाइंड विफल रहता है तो पासवर्ड गलत है।

कुछ सदृश करने के लिए:

if ((dn = ldap_get_dn(ld, e)) != NULL) { 
     printf("dn: %s\n", dn); 
     /* rebind */ 
     ldap_initialize(&ld2, LDAP_SERVER); 
     rc = ldap_simple_bind_s(ld2, dn, "secret"); 
     printf("%d\n", rc); 
     if (rc != 0) { 
      printf("Failed.\n"); 
     } else { 
      printf("Works.\n"); 
      ldap_unbind(ld2); 
     } 
     ldap_memfree(dn); 
    } 

यह दर्शाता है कि उपयोगकर्ता नाम गलत है (अर्थात उपयोगकर्ता खाते के लिए खोज विफल रहता है) आम तौर पर अत्यधिक प्रकटीकरण माना जाता है, और बचा जाना चाहिए सुरक्षा कारणों से।

+0

आपके उत्तर के लिए धन्यवाद। बाध्यकारी दूसरी बार सही काम करता है। एक पूरी तरह से अलग संदर्भ पर, मेरे पास एक और सवाल है: क्या आपके पास क्लाइंट को डिजाइन करने के बारे में अधिक जानने पर कोई स्रोत है? मैं "एन्क्रिप्शन" और "रेफ़रल" के लिए कार्यक्षमता चाहता हूं। धन्यवाद –

+0

कनेक्शन के लिए ldaps का उपयोग करके एन्क्रिप्शन समर्थन पूरा किया जाता है। रेफ़रल का पीछा करने के लिए, आप 'LDAP_OPT_DEREF' को उस मोड में सेट करते हैं जिसका आप उपयोग करना चाहते हैं। ग्राहकों को डिजाइन करना ... दुर्भाग्यवश, उत्तर देने के लिए एक सवाल बहुत बड़ा है। एकमात्र उचित उत्तर 'यह निर्भर करता है'। – Petesh

+0

जानकारी के लिए बहुत धन्यवाद! यह बहुत सराहना की है। :) –

संबंधित मुद्दे