因我公司总部有所有员工的信息,内部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");
我已经测试过了