2010-08-26 13 views
3

J'ai une application Java exécutée sous Windows qui doit s'authentifier auprès d'une application Web à l'aide de Kerberos/SPNEGO. Je suis conscient de la façon de configurer JAAS pour y parvenir, mais je trouve que l'implémentation Java (JDK6 et JDK7beta) de Kerberos manque de quelques fonctionnalités importantes dont j'ai besoin. Par exemple, prendre en charge les références ou utiliser le DNS pour comprendre le domaine d'un hôte (j'ai un environnement multi-domaine).Utilisation de SSPI pour obtenir l'authentification unique de l'application Java exécutée sous Windows

Existe-t-il un module tiers pouvant implémenter l'authentification à l'aide de Windows natif SSPI? Nous avons déjà eu la peine de configurer nos clients Windows pour qu'ils fonctionnent dans notre environnement, ce serait bien de ne plus avoir à le faire pour Java. Je suis au courant de Waffle et de son WindowsLoginModule, mais il ne semble pas faire SSO car il oblige les utilisateurs à entrer à nouveau leurs informations d'identification dans l'application.

+0

Veuillez noter que la déclaration «Je connais Waffle et son WindowsLoginModule, mais cela ne semble pas faire de SSO car cela nécessite que les utilisateurs saisissent à nouveau leurs informations d'identification dans l'application». est incorrect. Waffle fait SSO, c'est pour cela qu'il a été conçu et toute invite est un problème dans la configuration. –

Répondre

3

Nous avons eu un problème similaire. Le principal problème pour nous était que l'implémentation de GSS-API échouait lors de l'utilisation de Windows UAC et nous l'avons résolu en utilisant Waffle.

Waffle est fondamentalement une enveloppe pour les appels JNA à SSPI. Nous avons réussi à mettre en œuvre SSO à l'aide Waffle en remplaçant la classe sun.net.www.protocol.http.NegotiatorImpl:

package sun.net.www.protocol.http; 

import java.io.IOException; 
import waffle.windows.auth.impl.WindowsSecurityContextImpl; 

public class NegotiatorImpl extends Negotiator { 

private String serviceName; 

public NegotiatorImpl(HttpCallerInfo hci) throws IOException { 
    this.serviceName = "HTTP/" + hci.host.toLowerCase(); 
} 

    @Override 
    public byte[] firstToken() throws IOException { 
     return WindowsSecurityContextImpl.getCurrent("Negotiate", serviceName).getToken(); 
    } 

    @Override 
    public byte[] nextToken(byte[] in) throws IOException { 
     return new byte[0]; 
    } 
} 

Ensuite, vous pouvez créer un fichier JAR avec la tenue que cette classe et copiez-le avec la JNA Waffle & JARs à ./jre/lib/a approuvé de votre JVM. En utilisant le Java Endorsed Standards Override Mechanism de la machine virtuelle Java, cela remplace l'implémentation Negotiator par défaut de la machine virtuelle Java.

+0

J'ai essayé mais ces méthodes ne semblent pas appelées. Je vois jar étant chargé de jre/lib/endorsed, mais j'ai ajouté un couple à firstToken et nextToken et je ne les vois pas. Mon code de test fait simplement URL.openConnection contre un serveur avec SPNEGO. Je peux confirmer que cela fonctionne avec JAAS mais il fait exactement la même chose une fois que j'aurai abandonné le remplacement par NegotiatorImpl. Aucune suggestion? –

+0

J'ai réalisé que j'ai mélangé les paquets. Pour 1.6 c'est 'sun.net.www.protocol.http.NegotiatorImpl' et pour 1.7 c'est' sun.net.www.protocol.http.spnego.NegotiatorImpl'. Pouvez-vous vérifier si ceux-ci existent dans votre JVM? – Remo

+0

Cela a fonctionné! Maintenant, j'ai le problème que certains sites nécessitent un fonctionnement nextToken –