2016-08-27 29 views
10

Oluşturulan bir hizmet hesabıyla kullanıcıları LDAP'den doğrulamaya çalışıyorum. ctx = new InitialDirContext (env) hatası aldım;Java'da bir hizmet hesabıyla LDAP kimlik doğrulaması

[LDAP: hata kodu 49 - 8009030C: LdapErr: DSID-0C0903A8, yorum: AcceptSecurityContext hatası, veri 2030, v1db1

birisi nerede yanlış gidiyorum anlamak için bana yardımcı olabilir ?

Bu benim java dosya

/** 
* 
*/ 
package com.dei; 

import java.util.Hashtable; 

import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NameNotFoundException; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.SizeLimitExceededException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

public class LdapConnector { 


     private static final String LDAP_SERVER_PORT = "389"; 
     private static final String LDAP_SERVER = "server"; 
     private static final String LDAP_BASE_DN = "OU=role,OU=roles,OU=de,OU=apps,DC=meta,DC=company,DC=com"; 
     private static final String LDAP_BIND_DN = "cn=service_account";//service account userid provided by LDAP team 
     private static final String LDAP_BIND_PASSWORD = "password";///service account pwd provided by LDAP team 


     public 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 
        System.out.println("Login successful"); 
        return true; 
       } 
       else 
        return false; 

      } catch (AuthenticationException e) { // Invalid Login 
       System.out.println("Login failed" +e.getMessage()); 

       return false; 
      } catch (NameNotFoundException e) { // The base context was not found. 
       System.out.println("Login failed" +e.getMessage()); 
       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 */ } 
       } 
      } 
     } 
} 

cevap

3

hatayı geçersiz kimlik bilgileri için 49 standları, ancak tanı dizesi "AcceptSecurityContext hatası, veri 2030" dir, LDAP_BIND_DN "cn = yani "Hayır böyle bir nesne" anlamına service_account "dizinde bulunamadı. Tahminimce, "cn = service_account", hesabın tam DN'si değil.

+0

Burada yanlış bir baskı yaptığımızı düşünüyorum. "Misafirim" muhtemelen "Benim tahminim" anlamına geliyordu –

+0

Teşekkürler Vladislav, düzeltildi :) –

2

Bağlama işlemi, genellikle hesaptaki bir sorun nedeniyle başarısız oldu.

LDAP Sunucusuna bağlanmak için kullanılan bağ hesabının kimlik bilgilerinin doğru olduğundan emin olun.Hata kodu verileri 2030, kullanıcının DN'sinin geçersiz olduğu anlamına gelir.

İlgili konular