Wir verwenden JAAS, um Single Sign On in einer Java-Anwendung unter Verwendung des Windows Kerberos-Ticket-Cache zu ermöglichen. Unsere Konfigurationsdatei jaas.conf sieht wie folgt aus:
LoginJaas {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
doNotPrompt=true
debug=true;
};
Damit können wir einen Jaas LoginContext erstellen und erfolgreich das Kerberos-Ticket des Benutzers erhalten. Dieses Ticket senden wir mit JMI an unsere Serveranwendung. Was wir allerdings nicht schaffen, ist, auf dem Server zu überprüfen, ob das Kerberos-Ticket tatsächlich von unserem Active Directory erstellt wurde.
Im Moment führen wir eine sehr unsichere Validierung des Tickets durch, indem wir einfach prüfen, ob der Name des Server Principal (KerberosTicket.getServer()) unseren Domänennamen im Realm-Teil enthält. Aber natürlich könnte jeder einen eigenen Kerberos-Server mit demselben Realm-Namen einrichten und dieses Ticket zum Starten der Anwendung verwenden.
Eine Idee, die ich gefunden habe, war die Authentifizierung gegen das Active Directory LDAP unter Verwendung des Kerberos-Tickets. Leider verwenden wir Windows 7 und die Wiederverwendung des Kerberos-Tickets zur Authentifizierung gegenüber dem LDAP funktioniert nur, wenn ein Registrierungseintrag gesetzt wird (siehe http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html suchen Sie nach allowtgtsessionkey). Dies ist für unsere Benutzer inakzeptabel.
Gibt es eine Möglichkeit, das Ticket mit unserem Active Directory-Server abzugleichen? Ich vermute, dass es eine Möglichkeit gibt, zu überprüfen, ob das KerberosTicket.getServer() Ticket mit dem Ticket unseres Servers übereinstimmt, aber ich habe keine Ahnung, wie man das macht. UPDATE: KerberosTicket().getServer() gibt nur ein KerberosPrincipal zurück, das nichts anderes als den Namen des Servertickets und den Realm enthält und sich daher nicht zur Überprüfung eignet.
Vielen Dank für Ihre Hilfe, memminger