2012-08-28 8 views
8

Ich bin nicht in der Lage, einen Benutzer mit LDAP zu authentifizieren. Ich habe folgende Details bekam:LDAP: Authentifizierung von Benutzern mit Verbindungsdetails

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 

ich einen sAMAccountName Wert unter Verwendung der oben Details suchen, sondern wie ein Benutzer mit Benutzernamen und Passwort zu authentifizieren?
Wenn Sie meinen vorherigen Fragen folgen, werden Sie verstehen, dass ich erfolgreich eine Verbindung zum LDAP-Server herstellen kann, ihn aber nicht authentifizieren kann.
Benutzer zu authentifizieren:

user: someusername 
password: somepwd 

Ich bin nicht in der Lage mit 'somepwd' zu LDAP-Server zu verbinden und wie ich someusername verwenden soll. Ich kann gegebenen Benutzer als sAMAccountName suchen.

+1

Haben Sie das richtige Passwort? funktioniert es mit einem Client wie JXplorer? – dbrin

+0

@DmitryB Ich bin in der Lage, eine Verbindung zum Server mit 'secret', aber nicht mit 'somepwd' herzustellen. –

+0

falsches Passwort als :) – dbrin

Antwort

22

Dies ist ein Mashup von Sachen, die ich an verschiedenen Orten gefunden. Sie sollten den richtigen Pfad angeben, wenn Sie das UnboundID-SDK nicht verwenden möchten. Dies ist keine Produktionsqualität. Sie können das SSL-Material hier einfügen, wenn Ihr Shop dies unterstützt.

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

Dies ist die beste Lösung, die ich bisher gesehen habe. Ich war speziell auf der Suche nach Authentifizierung eines Benutzers nach Bindung an LDAP-Server. – likeToCode

+0

Ist dies sicher mit Verbindungspooling zu verwenden? – bdrx

7

Eine LDAP-Verbindung beginnt mit anonymous. Verwenden Sie die BIND-Anforderung, um den Autorisierungsstatus einer Verbindung zu ändern. Die BIND-Anforderung nimmt zwei Formen an, "einfach" oder "SASL". Die 'einfache' BIND-Anfrage benötigt einen eindeutigen Namen und ein Passwort. Die BIND-Anforderung sollte über eine sichere Verbindung oder eine nicht sichere Verbindung übertragen werden, die über die erweiterte Anforderung StartTLS an eine sichere Verbindung weitergeleitet wird.

Mit dem UnboundID LDAP SDK:

// 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

Ich kann das UnboundID LDAP SDK aufgrund der Einschränkungen des Clients nicht verwenden. Gibt es einen anderen Weg, um es zu erreichen? –

Verwandte Themen