I have a C# code to connect to LDAP Server and it works perfectly fine
The working C# code is given below
user = "myname@myorg.com";
string pwd = "secret";
String uid = "uid=" + user + ",ou=people,dc=myorg,dc=com";
int empID = 0;
DirectoryEntry root = new DirectoryEntry("LDAP://myorg.com", user, pwd, AuthenticationTypes.None);
try
{
object connected = root.NativeObject;
DirectorySearcher search = new DirectorySearcher(root);
search.Filter = "(&(objectClass=user)(objectCategory=Person))";
search.PropertiesToLoad.Add("SAMAccountName");
search.PropertiesToLoad.Add("EmployeeID");
foreach (System.DirectoryServices.SearchResult resEnt in search.FindAll())
{
System.DirectoryServices.DirectoryEntry de = resEnt.GetDirectoryEntry();
if (de.Properties["employeeID"].Value != null && de.Properties["userPrincipalName"].Value != null)
{
if (user.Equals(de.Properties["userPrincipalName"].Value))
{
string empIDstr = (string)de.Properties["employeeID"].Value;
int.TryParse(empIDstr, out empID);
Response.Write("EMp ID is No is "+empID);
}
}
}
}
catch(Exception ex)
{
Response.Write("Logon failed");
}
Now I am trying to do the same thing in java as I have another application to develop in Java but the following code throws exception
public class LdapClient {
public void authenticate(String user, String pwd){
String uid = "uid=" + user + ",ou=people,dc=myorg,dc=com";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://myorg.com");
env.put(Context.SECURITY_AUTHENTICATION, "none");
env.put(Context.SECURITY_PRINCIPAL, uid);
env.put(Context.SECURITY_CREDENTIALS, pwd);
try {
DirContext ctx = new InitialDirContext(env);
**//THE ERROR COMES AT THE LINE BELOW**
NamingEnumeration<?> namingEnum = ctx.search("ou=people,dc=myorg,dc=com", "(&(objectclass=user)(objectCategory=Person))", getSimpleSearchControls());
**strong text**
while (namingEnum.hasMore ()) {
SearchResult result = (SearchResult) namingEnum.next ();
Attributes attrs = result.getAttributes ();
System.out.println(attrs.get("cn"));
}
namingEnum.close();
} catch (Exception e) {
try {
e.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
private SearchControls getSimpleSearchControls() {
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String[] attrIDs = {"samAccountName","employeeID"};
searchControls.setReturningAttributes(attrIDs);
return searchControls;
}
}
PLEASE HELP as I thing the corresponding same code works in C#
javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C09075A, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db1 ]; remaining name 'ou=people,dc=myorg,dc=com'
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.searchAux(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.c_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at javax.naming.directory.InitialDirContext.search(Unknown Source)
at ldap.LdapClient.authenticate(LdapClient.java:51)
at ldap.LdapClient.main(LdapClient.java:30)
I have to do this in Java as I need to develop another application pointing to the same LDAP server . The client needs to be java. PLEASE HELP
The exceptions says that it requires an authentication (bind) before performing the operation (search).
As it's shown in the documentation try to use simple
authentication
// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");