2016-08-27 232 views
10

我正嘗試使用創建的服務帳戶從LDAP對用戶進行身份驗證。我得到低於錯誤ctx = new InitialDirContext(env);使用Java中的服務帳戶進行LDAP身份驗證

[LDAP:錯誤代碼49 - 8009030C:LdapErr:DSID-0C0903A8,註釋:AcceptSecurityContext錯誤,數據到2030年,v1db1

有人可以幫助我理解我要去哪裏錯了?

這是我的java文件

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

回答

3

錯誤49個代表無效的憑證,但診斷字符串 「AcceptSecurityContext錯誤,數據2030」,意思是 「沒有這樣的對象」,即LDAP_BIND_DN「CN = service_account「無法在目錄中找到。 我的猜測是「cn = service_account」不是帳戶的完整DN。

+0

我認爲我們在這裏有誤印。 「我的客人」可能是你的意思「我的猜測」 –

+0

謝謝弗拉季斯拉夫,糾正:) –

2

綁定操作失敗,通常是由於帳戶有問題。

確保用於連接到LDAP服務器的綁定帳戶的憑據是正確的。錯誤代碼數據2030表示用戶的DN無效。

相關問題