无法通过JAVA中的LDAP连接到Active Directory服务

时间:2016-11-21 08:11:48

标签: java ldap jndi ldap-query

是LDAP和Active Directory的新手。我刚刚在Windows Server 2012中安装了与Active Directory相关的功能,并且所有配置都已完成并创建了用户。

当我尝试通过LDAP连接Active Directory时出现以下错误。

Exception in thread "main" javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903C5, comment: AcceptSecurityContext error, data 52e, v2580]
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3067)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3013)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2815)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2729)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:296)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134)
at com.infomindz.sample.ldap.LDAPTest.main(LDAPTest.java:79)

我已尝试过在线文章中提供的一些解决方案,但仍然遇到同样的错误,并且不知道如何解决此类异常。仅使用以下代码我已尝试

public static void main(String[] args) throws NamingException
{

    final String ldapSearchBase = "dc=sample,dc=com";

    final String ldapUsername = "sampleAdminUser";
    final String ldapPassword = "password";

    final String ldapAccountToLookup = "sampleUser";


    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://XX.XX.XX.XX:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    if(ldapUsername != null)
    {
        env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
    }
    if(ldapPassword != null)
    {
        env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
    }

    LdapContext ctx1 = new InitialLdapContext(env, null);
    LDAPTest ldap = new LDAPTest();

    SearchResult srLdapUser = ldap.findAccountByAccountName(ctx1, ldapSearchBase, ldapAccountToLookup);

    System.out.println("srLdapUser :" + srLdapUser);

}

从以下代码行中的代码本身就出现了错误:

LdapContext ctx1 = new InitialLdapContext(env,null);

如果我在此处滞后,请发布您的背景信息。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您需要将用户的RDN提供为SECURITY_PRINCIPAL,例如“cn = Administrator”或完整的DN,如“cn = Administrator,ou = xyz,dc = infomindz,dc = com”。

要进行交叉检查,您可以安装类似Apache Directory Studio(https://directory.apache.org/studio/)的LDAP浏览器,并尝试连接到提供管理员用户的RDN或DN的AD。

答案 1 :(得分:0)

通过以下更新的代码,我通过使用 LDAP查询

Active Directory 获取用户和用户的详细信息来实现

ldapUsername 域名控制器的管理员用户。

ldapPassword 是管理员用户的密码。

ldapAccountToLookup 是必须在给定域下搜索的用户名。

public static void main(String[] args) throws NamingException
{

    final String ldapSearchBase = "dc=NewForest,dc=sample,dc=com";

    final String ldapUsername = "sampleAdminUser";
    final String ldapPassword = "Password";

    final String ldapAccountToLookup = "sampleUser";


    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://XX.XX.XX.XX:389");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
    env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
    DirContext ctx = new InitialDirContext(env);


    LDAPTest ldap = new LDAPTest();

    SearchResult srLdapUser = ldap.findAccountByAccountName(ctx, ldapSearchBase, ldapAccountToLookup);
    System.out.println("srLdapUser :" + srLdapUser);

}