2014-02-10 85 views
1

LDAP身份驗證我有一個Web應用程序,我嘗試使用LDAP身份驗證登錄系統(用戶使用其Windows會話ID登錄)與Java

我試過這個類:

public static boolean ad (String log,String pass) throws NamingException 
{ 
    try 
    { 
     System.out.println("Début du test Active Directory"); 

     Hashtable<String, String> ldapEnv = new Hashtable<String, String>(); 
     ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     ldapEnv.put(Context.PROVIDER_URL, "ldap://LDAPserver:389"); 
     ldapEnv.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5"); 
     ldapEnv.put("java.naming.security.sasl.realm","MyCompany.com"); 
     ldapEnv.put("javax.security.sasl.qop", "auth"); 
     ldapEnv.put("javax.security.sasl.strength","high"); 
     ldapEnv.put(Context.SECURITY_PRINCIPAL,log.toLowerCase()); 
     System.out.println(pass); 
     ldapEnv.put(Context.SECURITY_CREDENTIALS,pass);  
     ldapContext = new InitialDirContext(ldapEnv); 
     return true; 
    } 
    catch (Exception e) 
    { 
     return false; 
    } 
} 

它適用於某些用戶,但不適用於所有用戶,我不明白爲什麼。

+0

你會得到什麼例外? – EJP

+0

@EJP它適用於一些用戶對其他的我有這樣的例外:javax.naming.AuthenticationException:LDAP:錯誤代碼49 - 8009030C:LdapErr:DSID-0C0904DC,註釋:AcceptSecurityContext錯誤,數據52E,v1db1 –

+0

錯誤: 52e「當用戶名有效但密碼/憑證無效時返回。」 -jim – jwilleke

回答

1

我也做了同樣的事情在我的項目,它可能對你有所幫助。

package com.agileinfotech.bsviewer.ldap; 

import javax.naming.*; 
import javax.naming.directory.*; 
import java.util.Hashtable; 

public class LDAPLoginAuthentication { 

    public LDAPLoginAuthentication() { 
     // TODO Auto-generated constructor 
    } 

    public String authenticateUser(String username, String password) { 
     String strUrl = "success"; 

     System.out.print("username :" + username + " password" + password); 

     Hashtable env = new Hashtable(11); 
     boolean b = false; 
     String Securityprinciple = "cn=" + username + ",ou=users,o=agile-infotech,ou=system"; 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, "ldap://localhost:10389"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, Securityprinciple); 
     env.put(Context.SECURITY_CREDENTIALS, password); 

     try { 
      // Create initial context 
      DirContext ctx = new InitialDirContext(env); 
      // Close the context when we're done 
      b = true; 
      ctx.close(); 

     } catch (NamingException e) { 
      b = false; 
     } finally { 
      if (b) { 
       strUrl = "success"; 
      } else { 
       strUrl = "failure"; 
      } 
     } 

     return strUrl; 
    } 
} 
+0

它對我沒有任何作用! –

+0

你得到哪個錯誤..? –

+0

相同'錯誤:52e' –

1

我的答案來得很晚,但它可能會幫助一些用戶在任何情況下,所以...
開發商指定的認證適用於一些用戶,而不是其他。因此,這裏可能出現的一個錯誤是生成md5的方式:一些算法用於以數字格式存儲值,這是值從0開始的問題。這是因爲數字格式(整數等)將被刪除這些值來自0,並使您的MD5無效。