java sharepoint soap cxf ntlm

java - CXF SOAP Client con NTLM a SharePoint



(3)

Por favor, intente de esta manera!

HTTPConduit http = (HTTPConduit)client.getConduit(); AsyncHTTPConduit conduit = (AsyncHTTPConduit)http; DefaultHttpAsyncClient defaultHttpAsyncClient; defaultHttpAsyncClient = conduit.getHttpAsyncClient(); defaultHttpAsyncClient.getCredentialsProvider().setCredentials( AuthScope.ANY, new NTCredentials( USER,PWD, "", DOM ) ); conduit.getClient().setAllowChunking( false ); conduit.getClient().setAutoRedirect( true );

Estoy escribiendo un cliente SOAP usando CXF Framework (versión: 2.7.8) para SharePoint 2007. He seguido la documentación en línea para agregar soporte NTLM aquí . Tengo el cliente trabajando y el rastreo de la sesión HTTP muestra que se están enviando credenciales NTLM, sin embargo, sigo recibiendo una respuesta 401 no autorizada.

Código:

Lists listService = new Lists(); ListsSoap port = listService.getListsSoap(); BindingProvider bp = (BindingProvider) port; bp.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); Credentials creds = new NTCredentials(USER, PASS, "", DOMAIN); bp.getRequestContext().put(Credentials.class.getName(), creds); Client client = ClientProxy.getClient(proxy); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(36000); httpClientPolicy.setAllowChunking(false); httpClientPolicy.setAutoRedirect(true); http.setClient(httpClientPolicy); // Build request and execute

Curiosamente, escribí un cliente similar utilizando HTTP PUT para WebDAV para cargar documentos usando la biblioteca HTTPClient de Apache, y pude autenticarme exitosamente usando NTLM. Además, pude usar SOAPUI para invocar el mismo servicio web de Listas para el que estoy tratando de construir el cliente Java y también se autenticó exitosamente usando NTLM.

Supongo que la implementación de NTLM es diferente entre CXF y HTTPClient. ¿Alguna idea de lo que está mal con mi implementación de CXF? ¿O cómo puedo lograr que refleje la implementación de HTTPClient?


@lamarvannoy, también recibí este error. Pero encontré otra manera. No es necesario convertir HTTPConduit en AsyncHTTPConduit. Probemos esto:

public class Test { static final String kuser = "yourDomain//username"; static final String kpass = "yourPassword"; static class MyAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { System.err.println("Feeding username and password for " + getRequestingScheme()); return (new PasswordAuthentication(kuser, kpass.toCharArray())); } } public static void main(String[] args) throws Exception { Authenticator.setDefault(new MyAuthenticator()); Lists listService = new Lists(); ListsSoap port = listService.getListsSoap(); Client client = ClientProxy.getClient(port); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(36000); httpClientPolicy.setAllowChunking(false); http.setClient(httpClientPolicy); String listName = "S030_main"; String rowLimit = "150"; ArrayList<String> listColumnNames = new ArrayList<String>(); listColumnNames.add("Title"); Test.displaySharePointList(port, listName, listColumnNames, rowLimit); } }

Puede encontrar la implementación del método displaySharePointList () en esta publicación: http://davidsit.wordpress.com/2010/02/10/reading-a-sharepoint-list-with-java-tutorial/

Espero que esto te proteja a ti y a los demás.


Esto funciona para mí:

Client client = ClientProxy.getClient(port); AsyncHTTPConduit conduit = (AsyncHTTPConduit)client.getConduit(); AuthorizationPolicy authorization = conduit.getAuthorization(); authorization.setUserName("domain//username"); authorization.setPassword("password");

En realidad, esto funciona tanto para NTLM como para Basic