using (var ldap = new LdapConnection(new LdapDirectoryIdentifier(this.HostName))) {
ldap.SessionOptions.ProtocolVersion = 3;
ldap.AuthType = AuthType.Anonymous;
ldap.Bind();
var dn = GetDn(ldap, userName);
ldap.AuthType = AuthType.Basic;
try {
ldap.Bind(new NetworkCredential(dn, password));
return GetUser(ldap, dn);
} catch (LdapException) {
return null;
}
}
First step is just simple anonymous bind to retrieve distinguished name based on user name. If our UID is jdoe, we simply search for uid=jdoe
in dc=localdomain
(base DN) using sub-tree search. That should give us location of our user wherever he is. Let’s assume that user is now found at uid=jdoe,ou=People,dc=localdomain
.
Full DN of user is then used together with password to authenticate ldap connection. If authentication fails our user cannot logon. If it works than another ldap search (uid=jdoe,ou=People,dc=localdomain
) retrieves attributes, packs them into class and returns it back.
Sweet and simple.
P.S. Code in this post is just an excerpt. You can download full code here.