LDAP Authentifizierung mit sAMAccountName

EasyEagle

Mitglied
Hallo zusammen,

ich möchte (naja, ich muss :) ) gerne eine LDAP Authentifizierung mit sAMAccountName programmieren.
Natürlich weiß ich, dass es zum Thema LDAP wahnsinnig viele Seiten, Threads und Tutorials gibt. Und ja, ich weiß wie man Google benutzt :p
Aber ich komm einfach nicht weiter.

So sieht meine Authentifizierung bisher aus:
Java:
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
SimpleAuthenticationInfo info = null;

// Set up environment for creating initial context;
Hashtable<String, String> authEnv = new Hashtable<String, String>();
String userName = upToken.getUsername();
String passWord = new String(upToken.getPassword());
String ldapBaseDN = "ou=SBSUsers, ou=Users, ou=MyBusiness, dc=local";
String dn = "sAMAccountName=" + userName + ", " + ldapBaseDN;
//String dn = "cn="+userName+", "+ldapBaseDN;

authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
authEnv.put(Context.PROVIDER_URL, "ldap://192.168.10.2:389");
authEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
authEnv.put(Context.SECURITY_PRINCIPAL, dn);
authEnv.put(Context.SECURITY_CREDENTIALS, passWord);
	    	
//LDAP Authentication
DirContext authContext = null;
try {
    authContext = new InitialDirContext(authEnv);
    System.out.println("Authentication Success!");
		        
    SearchControls controls = new SearchControls();
    controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		           
    // trying to search
    NamingEnumeration<SearchResult> results = authContext.search(ldapBaseDN, "(objectClass=person)", controls);
		           
    while (results.hasMore()) {
        SearchResult searchResult = (SearchResult) results.next();
        Attributes attributes = searchResult.getAttributes();
        Attribute attr = attributes.get("cn");
        String attrCN = (String) attr.get();
        System.out.println("	#####		User: "+attrCN);
		            
        Attribute sAMAccountName = attributes.get("sAMAccountName");
        System.out.println("	#####		sAMAccountName: "+sAMAccountName.get());
    }
} catch (AuthenticationException authEx) {
    System.out.println("Authentication failed!");
    authEx.printStackTrace();
    throw new AuthorizationException(rb.getString("login.not_allowed"));
} catch (NamingException namEx) {
    System.out.println("Something went wrong!");
    namEx.printStackTrace();
}

Das Ganze läuft in einem ActiveDirectoryRealm, also mit Apache Shiro. Aber das sollte hier momentan keine Rolle spielen.

Mein Problem sieht wie folgt aus:
Wenn ich den String
C:
dn = "cn="+userName+", "+ldapBaseDN;
benutze und mich mit Vorname und Nachname + Passwort anmelde funktioniert alles super.
Allerdings möchte ich mich gern mit dem "sAMAccountName" anmelden und diesen Authentifizieren. Aber da bekomm ich dann immer die Fehlermeldung, dass der User nicht gefunden worden ist:
C:
javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903AA, comment: AcceptSecurityContext error, data 525, v1772
Mit
C:
dn = "uid="+userName+", "+ldapBaseDN;
hab ich es auch probiert, mit dem selben Ergebnis. Außerdem gibt es in unserem Active Driectory kein Attribut "uid".

Vielen Dank schon mal für die Hilfe!
Falls noch weitere Informationen benötigt werden stehe ich gerne zur Verfügung.
 
Hallo Tom,

vielen Dank für deine schnelle Antwort.
Dieses Beispiel hab ich bereits gefunden und es kommt meinem Problem auch sehr nahe.
Allerdings benutzt du da als Initialuser den Administrator:

Java:
    //Der Vollqualifizierte Name des Administrators im AD
    final static String ADMIN_NAME = "CN=Administrator,CN=Users,DC=home,DC=tutorials,DC=de";
    final static String ADMIN_PASSWORD = "DUMMYDUMMYDUMMY";

    ...

    env.put(Context.SECURITY_PRINCIPAL, ADMIN_NAME);
    env.put(Context.SECURITY_CREDENTIALS, ADMIN_PASSWORD);

Und genau an dieser Stelle möchte ich ja gern den User, der sich mit seinen sAMAcccountName anmelden möchte.

Ich hab jetzt noch 2 Ideen die ich schnell ausprobier.
to be continued...
 
Hmmm, hat leider nicht funktioniert.
Meine Idee wäre gewesen, dass ich eine Domain (z.B. Firmenname) als Präfix beim sAMAccountName mit angeben muss. Die andere Idee war den cn einfach leer zu lassen.

Ich werde wohl nicht drum rum kommen, einen Standard-User zu verwenden und dann dem Beispiel von Tom zu folgen.

@Tom: vielen Dank

Falls noch jemand was einfällt, Ideen sind immer willkommen :)
 

Neue Beiträge

Zurück