Werte aus ActiveDirectory auslesen

Status
Nicht offen für weitere Antworten.
J

Joltan

Gast
Hallo, nach etwas Sucherei und Recherche bin ich immer noch nicht schlauer und frage deshalb mal hier:

Ich möchte bestimmte Informationen des gerade angemeldeten Benutzers aus dem ActiveDirectory der Domäne lesen. Im Grunde brauche ich nur die dort hinterlegte eMail-Adresse, um sie dem Nutzer in einem Dialog als Defaultwert anbieten zu können. Nichts wildes also - denke ich mal so (naiv, wie ich bin).

Aus dem JNDI-Tutorial habe ich mir mal folgendes zusammengeklaubt:
Code:
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");
        try{
            ctx = new InitialDirContext(env);
            txtOutput.setText("INIT successfull!");
        } catch (Exception ex)
        {
            txtOutput.setText("INIT failed!\nMessage: "+ex.getMessage() + "\nType: " + ex.getClass().getName());
        }
Ich bekomme allerdings als ergebnis immer eine javax.naming.CommunicationException ("Connection refused: connect"). Ohne jetzt auf Drittanbieterbibliotheken auszuweichen: wie kann ich das machen, wo liegt mein Fehler?
 
J

Joltan

Gast
Ok, die javax.naming.CommunicationException habe ich inzwischen überwunden - da mein lokaler Rechner in der Domäne ist, mußte ich natürlich den korrekten Domainserver angeben. Die Erstellung des DirContext klappt jetzt also. Jetzt muß ich es nur noch schaffen die (bestehende) Benutzerauthentifizierung nutzen zu können um auch tatsächlich Werte auslesen zu können, ohne das der Benutzer sich nochmals an der Domäne anmelden muß...
 
J

Joltan

Gast
Ok, also ich komme offensichtlich nicht weiter:

Ich kann mich bei Kerberos und dem System authorisieren und bekomme einen entsprechenden LoginContext. Nun sollte ich mit der Subject.DoAs- bzw. der Subject.DoAsPrivileged-Methode eigentlich auf das ActiveDirectory zugreifen können. Also habe ich mir eine Klasse gebaut, die PrivilegedAction implementiert, die ich mit verschiedenen IADWorker-Objekten füttern kann, welche die konkreten Abfragen kapseln, und die dann mit dem Subject aus meinem LoginContext ausgeführt werden.

Trotzdem bekomme ich einen Fehler:
ADContextWorker: ERROR while processing!
Message: [LDAP: error code 1 - 00000000: LdapErr: DSID-0C090627, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece]
Type: javax.naming.NamingException
Cause: null

Wenn ich zusätzlich env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI"); beim Öffnen des InitialContext angebe, dann result es in folgender Fehlermeldung:
ADContextWorker: ERROR while processing!
Message: GSSAPI
Type: javax.naming.AuthenticationException
Cause: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
Der Punkt ist, daß ich ja bei Kerberos bereits angemeldet bin (erfolgreicher LoginContext.login()), und daher doch eigentlich mit dem entsprechenden Subject einfach meine Methode mit den entsprechenden Berechtigungen ausführen können sollte, oder? Wo fehlt noch was???

Die aufrufende Methode:
Code:
public static IADWorker DoWork(IADWorker pWorker){
        ADDirContextWorker pDCW = new ADDirContextWorker(pWorker);
        AccessControlContext acc = AccessController.getContext();
        Subject pSubj = ADTool.GetLoginContext().getSubject().getSubject(acc);
        Subject.doAsPrivileged(pSubj,pDCW,acc);
        return pDCW.GetADWorker();
}

Die PrivilegedAction-Klasse
Code:
public class ADDirContextWorker implements PrivilegedAction {
    private IADWorker pWorker;
    DirContext pDirCtx = null;

    public ADDirContextWorker(IADWorker pWorker)
    {
        this.pWorker = pWorker;
    }
    
    public IADWorker GetADWorker(){
        return this.pWorker;
    }

    public Object run() {
	return performJndiOperation();
    }

    private boolean performJndiOperation() {

	Hashtable env = new Hashtable();
	env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
	env.put(Context.PROVIDER_URL, ADTool.GetProviderURL());
        
        try{
            System.out.println("ADContextWorker: Trying to inistantiate new DirContext with ProviderURL");
	    pDirCtx = new InitialDirContext(env);
            System.out.println("ADContextWorker: DirContext successfully set!");
            System.out.println("ADContextWorker: '"+pWorker.getClass().getName()+"' worker started!");
            pWorker.DoWork(pDirCtx);
            System.out.println("ADContextWorker: Worker finished!");
            return true;
        }
        catch (Exception ex)
        {
            System.out.println("ADContextWorker: ERROR while processing!\n   Message: "+ex.getMessage()
            + "\n   Type: " + ex.getClass().getName()
             + "\n   Cause: " + ex.getCause());
            return false;
	}
        finally
        {
            if(pDirCtx != null)
            { 
                try {
                    pDirCtx.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}

Mein IADWorker-Interface:
Code:
public interface IADWorker {
    public void DoWork(DirContext pDirContext) throws Exception;
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand JSF Primefaces Textfeld-Werte speichern Allgemeines EE 1
F SessionScoped und Stateful EJB: Werte werden nicht behalten Allgemeines EE 3
M JSP werte aus dynamischen Buttons auslesen Allgemeines EE 3
D ArrayList behält Werte nicht Allgemeines EE 2
M XML einlesen und Werte in DB übertragen Allgemeines EE 2
S JSF datatable mit buttons Werte übergeben Allgemeines EE 5
M Struts - jsp site - werte formatieren Allgemeines EE 6
S Zwei Werte mit XPath vergleichen <x:if>. Allgemeines EE 2
T Werte aus einer Auswahliste mit Mehrfachauswahl lesen Allgemeines EE 4
B Api-auslesen Allgemeines EE 5
T HTTPS TLS 1.2 Seite auslesen Allgemeines EE 4
A JSF Parameter aus der URL auslesen Allgemeines EE 2
J Java Dependencies auslesen Allgemeines EE 19
P Get-Parameter auslesen Allgemeines EE 8
M SessionID per img-tag auslesen Allgemeines EE 2
W JAVA Optionen auslesen Allgemeines EE 3
N Metadaten (Spaltenüberschrift) über EntityBean auslesen? Allgemeines EE 3
T Hashtable value per JSTL auslesen Allgemeines EE 3
J Auslesen von <input type="file"> Allgemeines EE 2
H SQL Abfragen in Datenbanktabelle --> in JSP auslesen Allgemeines EE 3
F host aus sevletcontext auslesen Allgemeines EE 8
U Instanzen von *.war Dateien auslesen und steuern. Allgemeines EE 4
M Formularfelder Select (Option) auslesen Allgemeines EE 2
E Servlet: Wert aus eingabefeld auslesen funkioniert nicht Allgemeines EE 4
padde479 Parameter auslesen Allgemeines EE 4
R HTML CODE EINER SITE AUSLESEN Allgemeines EE 2
S [JSP Beans]Variable auslesen Allgemeines EE 3
G :?: seite mit jsp automatisch bestücken und auslesen Allgemeines EE 5

Ähnliche Java Themen


Oben