2012-08-28 10 views
8

मैं एलडीएपी का उपयोग कर उपयोगकर्ता को प्रमाणीकृत करने में सक्षम नहीं हूं।एलडीएपी: कनेक्शन विवरण के साथ उपयोगकर्ता को प्रमाणीकृत कैसे करें

URL=ldap://10.10.10.10:389 
LDAP BASE:DC=lab2,DC=ins 
LDAP Bind Account: CN=Ldap Bind,OU=Service Accounts,OU=TECH,DC=lab2,DC=ins 
LDAP Bind Account Pw: secret 

मैं ऊपर विवरण का उपयोग कर एक sAMAccountName मूल्य खोज सकते हैं, लेकिन कैसे उपयोगकर्ता नाम और पासवर्ड के साथ एक उपयोगकर्ता को प्रमाणित करने के लिए: मैं निम्नलिखित विवरण मिल गया है?
यदि आप मेरे पिछले प्रश्नों का पालन करते हैं तो आप समझेंगे कि, मैं सफलतापूर्वक एलडीएपी सर्वर से कनेक्ट करने में सक्षम हूं लेकिन उसे प्रमाणित करने में सक्षम नहीं हूं।
उपयोगकर्ता को प्रमाणित करने के:

user: someusername 
password: somepwd 

मैं 'somepwd' साथ LDAP सर्वर से कनेक्ट करने में सक्षम नहीं हूँ और मैं someusername कैसे इस्तेमाल करना चाहिए। मैं sAMAccountName के रूप में दिए गए उपयोगकर्ता को खोजने में सक्षम हूं।

+1

क्या आपके पास सही पासवर्ड है? क्या यह जेएक्सप्लोरर जैसे क्लाइंट का उपयोग कर काम करता है? – dbrin

+0

@DmitryB मैं 'गुप्त' के साथ सर्वर से कनेक्ट करने में सक्षम हूं लेकिन 'somepwd' के साथ नहीं। –

+0

से गलत पासवर्ड :) – dbrin

उत्तर

22

यह मैं विभिन्न स्थानों में पाया चीज़ें मैशप है। यदि आप UnboundID SDK का उपयोग नहीं करना चाहते हैं तो इसे आपको सही पथ के साथ रखना चाहिए। यह उत्पादन की गुणवत्ता नहीं है, यदि आप अपनी दुकान का समर्थन करते हैं तो आप यहां एसएसएल सामान जोड़ना चाहेंगे।

public static Boolean validateLogin(String userName, String userPassword) { 
    Hashtable<String, String> env = new Hashtable<String, String>(); 


    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldap://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN); 

    // To get rid of the PartialResultException when using Active Directory 
    env.put(Context.REFERRAL, "follow"); 

    // Needed for the Bind (User Authorized to Query the LDAP server) 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, LDAP_BIND_DN); 
    env.put(Context.SECURITY_CREDENTIALS, LDAP_BIND_PASSWORD); 

    DirContext ctx; 
    try { 
     ctx = new InitialDirContext(env); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } 

    NamingEnumeration<SearchResult> results = null; 

    try { 
     SearchControls controls = new SearchControls(); 
     controls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search Entire Subtree 
     controls.setCountLimit(1); //Sets the maximum number of entries to be returned as a result of the search 
     controls.setTimeLimit(5000); // Sets the time limit of these SearchControls in milliseconds 

     String searchString = "(&(objectCategory=user)(sAMAccountName=" + userName + "))"; 

     results = ctx.search("", searchString, controls); 

     if (results.hasMore()) { 

      SearchResult result = (SearchResult) results.next(); 
      Attributes attrs = result.getAttributes(); 
      Attribute dnAttr = attrs.get("distinguishedName"); 
      String dn = (String) dnAttr.get(); 

      // User Exists, Validate the Password 

      env.put(Context.SECURITY_PRINCIPAL, dn); 
      env.put(Context.SECURITY_CREDENTIALS, userPassword); 

      new InitialDirContext(env); // Exception will be thrown on Invalid case 
      return true; 
     } 
     else 
      return false; 

    } catch (AuthenticationException e) { // Invalid Login 

     return false; 
    } catch (NameNotFoundException e) { // The base context was not found. 

     return false; 
    } catch (SizeLimitExceededException e) { 
     throw new RuntimeException("LDAP Query Limit Exceeded, adjust the query to bring back less records", e); 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } finally { 

     if (results != null) { 
      try { results.close(); } catch (Exception e) { /* Do Nothing */ } 
     } 

     if (ctx != null) { 
      try { ctx.close(); } catch (Exception e) { /* Do Nothing */ } 
     } 
    } 
} 
+2

इस सबसे अच्छा समाधान मैंने देखा है अब तक, मैं विशेष रूप से LDAP सर्वर के लिए बाध्य करने के बाद एक उपयोगकर्ता के सत्यापन के लिए देख रहा था है। – likeToCode

+0

क्या यह कनेक्शन पूलिंग के साथ उपयोग करने के लिए सुरक्षित है? – bdrx

7

एक एलडीएपी कनेक्शन anonymous के रूप में शुरू होता है। किसी कनेक्शन की प्राधिकरण स्थिति बदलने के लिए, BIND अनुरोध का उपयोग करें। BIND अनुरोध दो रूपों, 'सरल' या 'एसएएसएल' लेता है। 'सरल' BIND अनुरोध एक विशिष्ट नाम और पासवर्ड लेता है। बीआईएनडी अनुरोध StartTLS विस्तारित अनुरोध का उपयोग कर सुरक्षित कनेक्शन पर प्रचारित एक सुरक्षित कनेक्शन, या एक सुरक्षित कनेक्शन पर प्रेषित किया जाना चाहिए।

UnboundID LDAP एसडीके का उपयोग करना:

// exception handling not shown 
LDAPConnection ldapConnection = new LDAPConnection(hostname,port); 
BindRequest bindRequest = new SimpleBindRequest(username,password); 
BindResult bindResult = ldapConnection.bind(bindRequest); 
if(bindResult.getResultCode().equals(ResultCode.SUCCESS)) { 
    /// successful authentication 
} 
ldapConnection.close(); 
+0

मैं ग्राहक के प्रतिबंध के कारण UnboundID LDAP SDK का उपयोग नहीं कर सकते। इसे हासिल करने का कोई और तरीका है? –

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

  • कोई संबंधित समस्या नहीं^_^