JAX-WS Sharepoint 401 non autorisé NTLM
J'essaie d'accéder à une liste Sharepoint via JAX-WS comme décrit ici
Cependant, lors de l'exécution du code ci-dessous j'obtiens:
java.lang.Exception: Exception. See stacktrace.com.sun.xml.internal.ws.client.ClientTransportException: The server sent HTTP status code 401: Unauthorized
Sharepoint nécessite une authentification NTLM. Quel peut être le problème? Merci beaucoup!
public static ListsSoap sharePointListsAuth(String userName, String password) throws Exception {
ListsSoap port = null;
if (userName != null && password != null) {
try {
Lists service = new Lists();
port = service.getListsSoap();
System.out.println("Web Service Auth Username: " + userName);
((BindingProvider) port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, userName);
((BindingProvider) port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
} catch (Exception e) {
throw new Exception("Error: " + e.toString());
}
} else {
throw new Exception("Couldn't authenticate: Invalid connection details given.");
}
return port;
}
source d'informationauteur Christoph
Vous devez vous connecter pour publier un commentaire.
J'ai été confrontée au même problème lors de la connexion avec JAX-WS pour Exchange web services, et voici ce qui a fonctionné pour moi:
Tout d'abord, créez un authentificateur:
Dans votre application, configurer l'authentification par défaut:
Remarque que je suis en utilisant la méthode #2 pour la spécification du domaine, comme décrit dans le Documentation de Java.
Basé sur mes connaissances acquises, en remplaçant le BindingProvider paramètres de ne PAS configurer le nom d'utilisateur et mot de passe. La façon la plus simple de le prouver c'est qu'il n'y a pas de moyen de passer le nom de domaine par le biais de la BP remplacer.
J'ai vu plusieurs posts sur internet, ce qui suggère une manière similaire à Marcel Levy suggestion ci-dessus pour utiliser un NTLM authentificateur exemple (Qui est la façon définis en fonction de la version 6 de JAVA documentation disponible à partir d'Oracle). Mais, cette solution ne fonctionne pas pour moi (j'était en train de développer un programme autonome, indépendante de toute application serveur logique).
J'ai googlé et essayé beaucoup de solutions à ce problème.. apparemment le code le plus simple qui a fonctionné est comme ci-dessous à l'aide de la bibliothèque JCIFS
Apparemment CXF 3.0 n'ont pas un moyen valable de configuration du Client HTTP (4.3.x) avec NTCredentials instance. Veuillez vous référer à bug https://issues.apache.org/jira/browse/CXF-5671
Par ailleurs, si vous avez un simple message qui doit être transmis, il suffit d'utiliser le Client HTTP (j'ai travaillé à l'aide 4.3.4.. pas sûr des versions antérieures) avec NTCredentials Instance. Que trop fait de la magie pour moi.. L'échantillon est comme ci-dessous:
Autant que je sache, vous ne pouvez pas faire de l'authentification NTLM par BindingProvider.
Si vous êtes familier avec Spring framework, vous pouvez utiliser Spring-WS. Spring-WS prend en charge le transport avec Apache HttpClient 4.x par le biais de la HttpComponentsMessageSender classe. Apache HttpClient 4.x a un bon support pour l'authentification NTLM. Vous pouvez utiliser le JAX-WS classes générées par l'outil wsimport comme argument pour marshalSendAndReceive.