2010-06-09 6 views
2

J'ai parcouru toutes les discussions ici sur StackOverflow concernant NTLM et Java, et je n'arrive pas à trouver la réponse. Je vais essayer d'être beaucoup plus précis.Apache Axis2 1.5.1 et l'authentification NTLM

est ici un code qui renvoie un stub client qui (je l'espère) est configuré pour l'authentification NTLM:

ServiceStub getService() { 
    try { 
    ServiceStub stub = new ServiceStub(
     "http://myserver/some/path/to/webservices.asmx"); // this service is hosted on IIS 
    List<String> ntlmPreferences = new ArrayList<String>(1); 
    ntlmPreferences.add(HttpTransportProperties.Authenticator.NTLM); 
    HttpTransportProperties.Authenticator ntlmAuthenticator = new HttpTransportProperties.Authenticator(); 
    ntlmAuthenticator.setAuthSchemes(ntlmPreferences); 
    ntlmAuthenticator.setUsername("me"); 
    ntlmAuthenticator.setHost("localhost"); 
    ntlmAuthenticator.setDomain("mydomain"); 
    Options options = stub._getServiceClient().getOptions(); 
    options.setProperty(HTTPConstants.AUTHENTICATE, ntlmAuthenticator); 
    options.setProperty(HTTPConstants.CHUNKED, "false"); 
    return stub; 
    } catch (AxisFault e) { 
     e.printStackTrace(); 
    } 
     return null; 
} 

Ce retourne un objet SerivceStub valide. Lorsque je tente d'invoquer un appel sur le talon, je vois ce qui suit dans mon journal:

Jun 9, 2010 12:12:22 PM org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme 
INFO: NTLM authentication scheme selected 
Jun 9, 2010 12:12:22 PM org.apache.commons.httpclient.HttpMethodDirector authenticate 
SEVERE: Credentials cannot be used for NTLM authentication: org.apache.commons.httpclient.UsernamePasswordCredentials 

Quelqu'un at-il une solution à ce problème?

+1

je pense avoir la réponse. N'utilisez pas Axis. Axis dit qu'il prend en charge NTLM, mais il a besoin d'informations d'identification. Ceci est inutile dans un environnement SSO où nous voulons les informations d'identification ambiantes. Cela devrait être une solution facile pour Axis dans Java 6 parce que Java 6 est livré avec NTLM natif, mais je suppose qu'ils s'en foutent. Je vais essayer CXF - ça devrait marcher ... ou du moins j'espère que c'est le cas. – andyczerwonka

+0

CXF fonctionne très bien - déposez Axis si vous avez besoin de NTLM. – andyczerwonka

+1

Il n'y a pas de code dans CXF pour gérer NTLM. Cela dépend du support NTLM fourni par JDK. Lors du travail NTLM avec CXF, nous devions définir httpClientPolicy.setAllowChunking (false) ;. Cela n'a pas fonctionné sans cet ensemble de propriétés. –

Répondre

3

Essayez ceci: http://robaustin.wikidot.com/axis Ça marche pour moi. Vous devez appeler setupCertsAndCredential() avant getService()

private void setupCredential() { 
    final NTCredentials nt = new NTCredentials("user", "pass", "", "domain"); 
    final CredentialsProvider myCredentialsProvider = new CredentialsProvider() { 
    public Credentials getCredentials(AuthScheme scheme, String host, int port, boolean proxy) throws CredentialsNotAvailableException { 
    return nt; 
    } 
    }; 
    DefaultHttpParams.getDefaultParams().setParameter("http.authentication.credential-provider", myCredentialsProvider); 
} 

ServiceStub getService() { 

    try { 
    ServiceStub stub = new ServiceStub( 
     "http://myserver/some/path/to/webservices.asmx"); // this service is hosted on IIS 

    return stub;  
    } catch (AxisFault e) {  
     e.printStackTrace();  
    }  
     return null;  
}  
+0

comme mentionné dans mon message, je veux utiliser NTLM ambiante. Votre message est erroné en ce sens que je dois fournir les informations d'identification lorsque je veux simplement les transmettre. Axis ne supporte pas cela donc je suis allé avec CXF. – andyczerwonka

0

HttpClient ne marche pas NTLM v2 soutien donc j'utilise la bibliothèque JCIFS pour retourner le type de message de NTLM comme décrit dans ce site

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

Je viens d'utiliser le fichier JCIFS_NTLMScheme.java du site Web ci-dessus pour enregistrer le schéma d'autorisation et cela a fonctionné !!!!

client Exemple:

List authSchema = new ArrayList(); 
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, org.tempuri.JCIFS_NTLMScheme.class); 
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator(); 
auth.setUsername(""); 
auth.setPassword(""); 
auth.setDomain(""); 
auth.setHost(""); 
auth.setPort(); 
List authPrefs = new ArrayList(1); 
authPrefs.add(AuthPolicy.NTLM); 
auth.setAuthSchemes(authPrefs); 
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);