簡體   English   中英

具有NTLM到SharePoint的CXF SOAP客戶端

[英]CXF SOAP Client with NTLM to SharePoint

我正在使用SharePoint 2007的CXF Framework(版本:2.7.8)編寫SOAP客戶端。我已經按照在線文檔的說明在此處添加NTLM支持。 我有客戶端在工作,並且跟蹤HTTP會話顯示正在發送NTLM憑據,但是,我仍然收到401未經授權的響應。

碼:

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調用我要為其構建Java客戶端的相同的Lists Web服務,並且它也可以使用NTLM成功進行身份驗證。

我假設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<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/

我希望這可以確保您和他人的時間安全。

這對我有用:

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

實際上,這對於NTLM和Basic均適用

這是我必須要做的事情:

// Include a version of WSDL in class path, make URL point to that
URL url = MyClient.class.getResource("previouslydownloaded.wsdl");

MyCxFService ws = new MyCxFService(url);
MyCxfClient client = ws.getMyCxfServicePort(); 

BindingProvider prov = ((BindingProvider) client);
Binding binding = prov.getBinding();

// Set Username and Password
if ((this.user != null) && (!this.user.isEmpty())) {
  prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, this.user);
  prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, this.passwd);
}

// Get address from config file to get rid error caused by using wsdl file:
// Caused by: java.lang.NullPointerException
//   at org.apache.cxf.transport.http.URLConnectionHTTPConduit.createConnection(URLConnectionHTTPConduit.java:104)
prov.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, this.portAddress);

希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM