InitialLdapContext 返回 LDAP:错误代码 49

InitialLdapContext returned LDAP: error code 49

我 运行 在我的 spring 引导应用程序中尝试连接到 ldap 服务器时遇到问题。 我使用 ADExplorer 验证了 URL、用户名和密码均有效。 我还逐步跟踪相同的信息,以确保信息在通话前正确无误。

Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
if(ldapUsername != null) {
    env.put(Context.SECURITY_PRINCIPAL, ldapUsername);
}
if(ldapPassword != null) {
    env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
}
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapAdServer);
env.put("java.naming.ldap.attributes.binary", "objectSID");

ctx = new InitialLdapContext(env, null);<==== exception thrown
return ctx;
ldap:
    host:
      ldapadserver: ldap://ldapserver.com
    search:
      ldapsearchbase: OU=AD Master OU,OU=###,DC=###,DC=###
    user:
      ldapusername: ####
      ldappassword: ENC(#####)
Exception while loading user configuration file : javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090447, comment: AcceptSecurityContext error, data 52e, v3839]
javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090447, comment: AcceptSecurityContext error, data 52e, v3839]
        at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3261)
        at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3207)
        at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2993)
        at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2907)
        at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:347)
        at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:225)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189)
        at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:243)
        at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154)
        at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
        at javax.naming.InitialContext.init(InitialContext.java:244)
        at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:154)

只是一个更新:我听从了建议并使用完整的 DN 字符串作为 ldapUserName 并且一切正常。

你不说,但假设这是 Microsoft Active Directory。猜猜你需要这个: env.put(Context.SECURITY_PROTOCOL, "ssl");

也不知道 ENC(#####) 是什么?

我们有几个已知的例子: https://github.com/jwilleke/Examples-JNDI/tree/master/src/com/willeke/samples/ldap/jndi

错误信息中的data 52e指的是Windows System Error code,即:

ERROR_LOGON_FAILURE

1326 (0x52E)

The user name or password is incorrect.

所以肯定是在抱怨你的凭据。

用户名是什么格式?您在另一个答案的评论中提到 cn=ldapuser,但这不适用于 AD。格式应为以下格式之一:

  • 只是用户名(sAMAccountNameuserPrincipalName)例如ldapuser
  • domain\username,例如DOMAIN\ldapuser
  • 专有名称,例如CN=ldapuser,OU=Users,DC=example,DC=com