2014-02-12 39 views
1

我正在为SharePoint 2007编写一个使用CXF Framework(版本:2.7.8)的SOAP客户端。我遵循联机文档以添加NTLM支持here。我有客户端工作并跟踪HTTP会话显示正在发送NTLM凭据,但是,我仍然收到401未经授权的响应。带有NTLM到SharePoint的CXF SOAP客户端

代码:

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身份验证成功。另外,我能够使用SOAPUI来调用相同的列表Web服务我试图构建Java客户端,并使用NTLM成功进行身份验证。

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

回答

4

请试试这个方法!

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

感谢您的答复。当我尝试你的建议时,我得到:'org.apache.cxf.transport.http.URLConnectionHTTPConduit无法转换为org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit'。我使用'ClientProxy.getClient(代理)'检索我的客户端。想法? – lamarvannoy

+0

这对我来说非常好,谢谢@Jay! – jlr

+0

为了使用org.apache.cxf.transport.http.URLConnectionHTTPConduit的org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit instread,我们需要将CXF传输转换为cxf-rt-transports-http-hc-x.x.x.jar –

1

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

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

我希望这将您的安全和他人的时间。

0

这个工作对我来说:

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

其实这个工程的NTLM和基本