我目前正在开发一个包含Active Directory和一些LDAP内容的小项目...... 我尝试连接到LDAP服务器,它总是给我同样的错误:
[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1
据我所知,这意味着凭证是错误的,但我百分百肯定他们是对的! 可能是我忘记了参数吗?
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://libertycity.ch:389/dc=libertycity,dc=ch");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.SECURITY_PRINCIPAL, "uid=" + username + ",ou=Users");
env.put("java.naming.ldap.attributes.binary", "objectSID");
DirContext ctx = new InitialDirContext(env);
我认为我的代码看起来不错,或者我错过了什么?可能是什么问题,我怎么能找到它?
答案 0 :(得分:17)
错误中提供的值“data 52e”表示绑定失败,原因如下: 当用户名有效但密码/凭证无效时返回。
http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors
答案 1 :(得分:10)
如果用户名中未包含完整域,则也可能出现此问题。
将安全主体设置为username@domain
。
InitialLdapContext ldapContext = new InitialLdapContext();
ldapContext.addToEnvironment(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapContext.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
ldapContext.addToEnvironment(Context.SECURITY_PRINCIPAL, userId + "@mydomain.com");
ldapContext.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
ldapContext.addToEnvironment(Context.PROVIDER_URL, "ldap://" + ldapHost + ":" + ldapPort);
答案 2 :(得分:2)
我遇到了尝试保护从wildfly到Microsoft Active Directory服务器的连接的问题,主要问题是不知道连接字符串应该是什么。
如果您安装了“Active Directory资源管理器”&#39;来自Sysinternals的软件包由微软提供。搜索您要绑定的对象,路径:&#39;将显示设置。这是您需要在Context.SECURITY_PRINCIPAL值的参数中引用的值字符串。
在我的例子中,路径字符串的格式为
CN = Fred博客,OU = XXX用户,DC = foo-bar,DC = com,xxx.foo-bar.com:389 [xxx.foo-bar.com]]
必需的参数是
&#34; CN = Fred博客,OU = XXX用户,DC = foo-bar,DC = com&#34;
请注意,空格非常重要
答案 3 :(得分:1)
LDAP错误代码49表示“凭据无效”,这意味着您发送到LDAP服务器的密码不正确。
答案 4 :(得分:1)
Active Directory:检查您的域容器。
我在从eDirectory迁移到Active Directory时遇到了同样的错误,用户名和密码似乎是正确的但是出于某种原因我仍然得到了#34; 52e&#34;错误,表示密码不正确。
我必须将DC(域容器)添加到主体中才能使其工作:
这不起作用:
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC");
添加DC :(这对我有用)
env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC,DC=yourorg,DC=com");
这解决了Active Directory的问题。
真正帮助我解决此问题的方法是尝试使用linux ldapbind / ldapsearch命令https://docs.oracle.com/cd/B10501_01/network.920/a96579/comtools.htm进行绑定。
如果您使用ldapbind / ldapsearch命令从操作系统开始工作,那么您将知道应在代码中使用哪些确切参数。
答案 5 :(得分:0)
DirContext ldapContext;
Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//ldapEnv.put(Context.PROVIDER_URL, "ldap://societe.fr:389");
ldapEnv.put(Context.PROVIDER_URL, "ldap://10.112.115.14:389");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "vmware-china@viewconnection.com");
ldapEnv.put(Context.SECURITY_CREDENTIALS, "ca$hc0w");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
//ldapEnv.put(Context.SECURITY_PROTOCOL, "simple");
ldapContext = new InitialDirContext(ldapEnv);
System.out.println(ldapContext);
// Create the search controls
SearchControls searchCtls = new SearchControls();
//Specify the attributes to return
String returnedAtts[]={"sn","givenName", "samAccountName", "mail"};
searchCtls.setReturningAttributes(returnedAtts);
//Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
//specify the LDAP search filter
String searchFilter = "(&(objectClass=user)(mail=*))";
//Specify the Base for the search
String searchBase = "DC=VIEWCONNECTION, DC=COM";
//initialize counter to total the results
int totalResults = 0;
// Search for objects using the filter
NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);
//Loop through the search results
while (answer.hasMoreElements())
{
SearchResult sr = (SearchResult)answer.next();
totalResults++;
System.out.println(">>>" + sr.getName());
Attributes attrs = sr.getAttributes();
System.out.println(">>>>>>" + attrs.get("samAccountName"));
}
System.out.println("Total results: " + totalResults);
ldapContext.close();