是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);
如果我在此处滞后,请发布您的背景信息。 提前谢谢。
答案 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);
}