日期:2014-05-20  浏览次数:20781 次

LDAP 认证问题,连接微软的AD.急急???
因我公司总部有所有员工的信息,内部email用户和密码是AD服务器,现在我们想用email的用户和密码来认证,以进入我们的一个应用平台。也就是用户只要有邮箱,并用邮箱帐号就可以进入我们的一个应用,我们的应用就不需建用户了。
服务器地址是一个域名“ptr.petrochina”,ping   可以通,但地址好像是动态变的,
想用java   的LDAP连接微软的AD服务器。在goole里面搜索了一下。找到一段代码:

  public   boolean   checkAd(String   id,String   pwd){
env   =   new   Hashtable();
                env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory ");
                env.put(Context.PROVIDER_URL,   "ldap://ptr.petrochina:389/cn=users,DC=ptr,DC=petrochina ");
                env.put(Context.SECURITY_AUTHENTICATION, "Simple ");
         
                env.put(Context.SECURITY_PRINCIPAL, "cn= "+id+ ",cn=users,DC=ptr,DC=petrochina ");
                env.put(Context.SECURITY_CREDENTIALS   ,   pwd   );
try{
        System.out.println( "-----ddd-------- ");
        ctx=(DirContext)   new   InitialContext(env);
        System.out.println( "-------eee------ ");
        islogin=true;
}catch(AuthenticationException   aue)
        {
        aue.printStackTrace();
            islogin=false;
       
        }   catch   (NamingException   e)   {
e.printStackTrace();
}finally{
try   {
ctx.close();
}   catch   (Exception   ie)   {


}


}
       
        return   islogin;
        }

但运行不成功,出现错误:
[LDAP:   error   code   49   -   80090308:   LdapErr:   DSID-0C090334,   comment:   AcceptSecurityContext   error,   data   525,
不知道是不是我的env写的不对,还是什么原因?有没有哪位大大做过这方面的东西,帮忙看看啊。

------解决方案--------------------
public static DirContext getConnection(String bindUser, String bindUserPassword) throws Exception {

Hashtable env = new Hashtable();
env.put( "java.naming.factory.initial ", Config.JNDI_FACTORY); //必须这样写,无论用什么LDAP服务器
env.put( "java.naming.provider.url ",Config.JNDI_URL);
env.put( "java.naming.security.principal ", bindUser);
env.put( "java.naming.security.credentials ", bindUserPassword);

return new InitialLdapContext(env, null);

}

我项目里面是这样,这个方法在open ldap ,sun的ad下都通过。
仔细检查一下?
------解决方案--------------------
搂主是在给油田做东西吧?
这样就可以了:
 env.put(Context.SECURITY_PRINCIPAL, "cn= "+id+ ",cn=users,DC=ptr,DC=petrochina "); 
改为: env.put(Context.SECURITY_PRINCIPAL, id+ "@ptr.petrochina"); 
我已经测试过了