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。格式应为以下格式之一:
- 只是用户名(
sAMAccountName
或 userPrincipalName
)例如ldapuser
- domain\username,例如
DOMAIN\ldapuser
- 专有名称,例如
CN=ldapuser,OU=Users,DC=example,DC=com
我 运行 在我的 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。格式应为以下格式之一:
- 只是用户名(
sAMAccountName
或userPrincipalName
)例如ldapuser
- domain\username,例如
DOMAIN\ldapuser
- 专有名称,例如
CN=ldapuser,OU=Users,DC=example,DC=com