2015-11-02 77 views
1

我在兩個域中有兩個Active Directory:domain1.xx和domain2.xx 我有一個用戶屬於domain1.xx,名爲user1。 我可以使用user1在domain1上執行LDAP查詢。 user1在domain2.xx上具有讀取權限,並且我已使用AD Explorer對其進行了測試,並且它可以正常工作。 問題是,當我使用Java,它返回我這個例外: 錯誤:[LDAP:錯誤代碼49 - 80090308:LdapErr:DSID-0C090334,註釋:AcceptSecurityContext錯誤,數據525,vece在AD中使用來自另一個AD的用戶在java中搜索

此代碼連接查詢了域,它的工作原理:

package ad; 

import java.util.Enumeration; 
import java.util.Hashtable; 
import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

public class AD { 


    static DirContext ldapAuthenticate(String password, String userdn) throws Exception { 
     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     //set security credentials, note using simple cleartext authentication 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, userdn); 
     env.put(Context.SECURITY_CREDENTIALS, password); 
     //connect to my domain controller 
     env.put(Context.PROVIDER_URL, "ldap://domain1.xx"); 
     //Create the initial directory context 
     DirContext ctx = null; 
     try { 

      ctx = new javax.naming.directory.InitialDirContext(env); 

     } catch (AuthenticationException e) { 

      System.out.println("ERROR: "+e.getMessage()); 
     } catch (Exception e) { 
      System.out.println("ERROR: "+e.getMessage()); 
         //something went wrong 
      ///handle in some way 
     } 
     return ctx; 
    } 

    public static void main(String[] args) throws Exception { 
     DirContext context = ldapAuthenticate("xxxxxx","[email protected]"); 
     String userdn = "dc=domain1,dc=xx"; 
     SearchControls searchCtrls = new SearchControls(); 
     searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
     String[] attributes = {"member"}; 
     searchCtrls.setReturningAttributes(attributes); 

     //Change the NameOfGroup for the group name you would like to retrieve the members of. 
     String filter ="objectclass=*"; 
     NamingEnumeration values = context.search(userdn, filter, null); 

     //Loop through the search results 
     while (values.hasMoreElements()) { 
      SearchResult sr = (SearchResult) values.next(); 
      System.out.println(">>>" + sr.getName()); 
      javax.naming.directory.Attributes attrs = sr.getAttributes(); 

      if (null != attrs) { 
       for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();) { 
        Attribute atr = (Attribute) ae.next(); 
        String attributeID = atr.getID(); 
        Enumeration vals = atr.getAll(); 

        if (vals.hasMoreElements()) { 
         String username = (String) vals.nextElement(); 
         System.out.println("Username: " + username); 

        } 
       } 
      } else { 
       System.out.println("No members for groups found"); 
      } 
     } 
    } 
} 

當我想查詢domain2.xx我有例外:

package ad; 

import java.util.Enumeration; 
import java.util.Hashtable; 
import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

public class AD { 


    static DirContext ldapAuthenticate(String password, String userdn) throws Exception { 
     Hashtable env = new Hashtable(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     //set security credentials, note using simple cleartext authentication 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, userdn); 
     env.put(Context.SECURITY_CREDENTIALS, password); 
     //connect to my domain controller 
     env.put(Context.PROVIDER_URL, "ldap://domain2.xx"); 
     //Create the initial directory context 
     DirContext ctx = null; 
     try { 

      ctx = new javax.naming.directory.InitialDirContext(env); 

     } catch (AuthenticationException e) { 

      System.out.println("ERROR: "+e.getMessage()); 
     } catch (Exception e) { 
      System.out.println("ERROR: "+e.getMessage()); 
         //something went wrong 
      ///handle in some way 
     } 
     return ctx; 
    } 

    public static void main(String[] args) throws Exception { 
     DirContext context = ldapAuthenticate("xxxxxx","[email protected]"); 
     String userdn = "dc=domain2,dc=xx"; 
     SearchControls searchCtrls = new SearchControls(); 
     searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
     String[] attributes = {"member"}; 
     searchCtrls.setReturningAttributes(attributes); 

     //Change the NameOfGroup for the group name you would like to retrieve the members of. 
     String filter ="objectclass=*"; 
     NamingEnumeration values = context.search(userdn, filter, null); 

     //Loop through the search results 
     while (values.hasMoreElements()) { 
      SearchResult sr = (SearchResult) values.next(); 
      System.out.println(">>>" + sr.getName()); 
      javax.naming.directory.Attributes attrs = sr.getAttributes(); 

      if (null != attrs) { 
       for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();) { 
        Attribute atr = (Attribute) ae.next(); 
        String attributeID = atr.getID(); 
        Enumeration vals = atr.getAll(); 

        if (vals.hasMoreElements()) { 
         String username = (String) vals.nextElement(); 
         System.out.println("Username: " + username); 

        } 
       } 
      } else { 
       System.out.println("No members for groups found"); 
      } 
     } 
    } 
} 

任何人都可以使用這種情況下幫助。 [email protected]可以讀取domain2.xx中的所有OU,我嘗試過使用AD Explorer。

回答

0

您發佈的身份驗證錯誤包含可能有用的特殊代碼。在你的情況下,代碼是525(AcceptSecurityContext錯誤,數據525)。代碼525的意思是「用戶未找到」。根據您的代碼判斷您正在重複使用同一用戶 - user1 @ domain1。此用戶僅在域1中存在。域2不知道此用戶,因此AD域控制器拒絕認證嘗試。

附加到問題的代碼示例針對特定的域控制器運行,而不是全局編錄。儘量做到以下幾點:

  • 使用InitialLdapContext代替InitialDirContext
  • 綁定到全局編錄,而不是域控制器。爲此,請使用URL ldap:// FQDN:3268。請不要端口是3268.

請注意,端口3268是不安全的。

希望這會有所幫助。