使用NTLM到SharePoint的CXF SOAP客户端

我正在使用适用于SharePoint 2007的CXF Framework(版本:2.7.8)编写SOAP客户端。我已经按照联机文档在此处添加了NTLM支持。 我让客户端工作并跟踪HTTP会话显示正在发送NTLM凭据,但是,我仍然收到401 Unauthorized响应。

码:

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 

有趣的是,我使用HTTP PUT为WebDAV编写了一个类似的客户端,使用Apache HTTPClient库上传文档,并且能够使用NTLM成功进行身份validation。 此外,我能够使用SOAPUI来调用我正在尝试构建Java客户端的相同列表Web服务,并且它也使用NTLM成功进行了身份validation。

我假设在CXF和HTTPClient之间NTLM的实现是不同的。 关于我的CXF实施有什么问题的任何想法? 或者我如何让它镜像HTTPClient实现?

请试试这个!

 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 ); 

@lamarvannoy,我也遇到了这个错误。 但我发现了另一种方式。 您不需要将HTTPConduit强制转换为AsyncHTTPConduit。 让我们试试这个东西:

 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 listColumnNames = new ArrayList(); listColumnNames.add("Title"); Test.displaySharePointList(port, listName, listColumnNames, rowLimit); } } 

您可以在这篇文章中找到displaySharePointList()方法的实现: http : //davidsit.wordpress.com/2010/02/10/reading-a-sharepoint-list-with-java-tutorial/

我希望这会安全你和他人的时间。

这对我有用:

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

实际上这适用于NTLM和Basic