2012-08-28 13 views
8

LDAP kullanarak bir kullanıcının kimliğini doğrulayamıyorum. LDAP: Bağlantı ayrıntıları ile kullanıcının kimliği nasıl doğrulanır?

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 

Yukarıda bilgilerini kullanarak bir sAMAccountName değeri arama yapabilirsiniz

, ama nasıl kullanıcı adı ve şifre ile bir kullanıcının kimliğini doğrulamak için: Ben şu ayrıntıları var?
Önceki sorularımı takip ederseniz, anlayacağınız gibi, LDAP sunucusuna başarılı bir şekilde bağlanabiliyor ancak kimliğini doğrulayamıyorum.
Kullanıcı kimlik doğrulaması için:

user: someusername 
password: somepwd 

Ben 'somepwd' LDAP sunucusuna bağlanmak mümkün değildi ve ben someusername nasıl kullanmalıdır. Verilen kullanıcıyı sAMAccountName olarak arayabiliyorum.

+1

Doğru şifreniz var mı? JXplorer gibi bir istemci kullanarak çalışır mı? – dbrin

+0

@DmitryB Sunucuya 'gizli' ancak 'somepwd' ile bağlanamıyorum. –

+0

:) 'dan yanlış şifre – dbrin

cevap

22

Bu benim çeşitli yerlerde bulunan şeyler bir mashup olduğunu. UnboundID SDK'yi kullanmak istemezseniz sizi doğru yola koymalısınız. Bu üretim kalitesi değil, mağazanız destekliyorsa SSL ürünlerini buraya eklemek isteyebilirsiniz.

yardımcı olabilecek
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

Bu, şimdiye kadar gördüğüm en iyi çözüm, özellikle LDAP sunucusuna bağlandıktan sonra bir kullanıcının kimliğini doğrulamak için arıyordum. – likeToCode

+0

Bağlantı havuzu ile kullanmak güvenli midir? – bdrx

7

Bir LDAP bağlantısı, anonymous olarak başlatılır. Bir bağlantının yetki durumunu değiştirmek için BIND isteğini kullanın. BIND isteği iki biçim alır: 'basit' veya 'SASL'. 'Basit' BIND isteği ayırt edici bir isim ve şifre alır. BIND isteği güvenli bir bağlantı üzerinden veya StartTLS genişletilmiş isteği kullanılarak güvenli bir bağlantıya yükseltilen güvenli olmayan bir bağlantı üzerinden iletilmelidir. UnboundID LDAP SDK kullanarak

:

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

İstemcinin kısıtlamaları nedeniyle UnboundID LDAP SDK'yı kullanamıyorum. Bunu başarmanın başka bir yolu var mı? –

İlgili konular