2010-06-09 179 views
2

我瀏覽過關於NTLM和Java的StackOverflow的所有討論,我似乎無法找到答案。我會盡力而且更具體。Apache Axis2 1.5.1和NTLM身份驗證

下面是一些代碼,返回客戶端存根(我希望)配置爲NTLM身份驗證:

ServiceStub getService() { 
    try { 
    ServiceStub stub = new ServiceStub(
     "http://myserver/some/path/to/webservices.asmx"); // this service is hosted on IIS 
    List<String> ntlmPreferences = new ArrayList<String>(1); 
    ntlmPreferences.add(HttpTransportProperties.Authenticator.NTLM); 
    HttpTransportProperties.Authenticator ntlmAuthenticator = new HttpTransportProperties.Authenticator(); 
    ntlmAuthenticator.setAuthSchemes(ntlmPreferences); 
    ntlmAuthenticator.setUsername("me"); 
    ntlmAuthenticator.setHost("localhost"); 
    ntlmAuthenticator.setDomain("mydomain"); 
    Options options = stub._getServiceClient().getOptions(); 
    options.setProperty(HTTPConstants.AUTHENTICATE, ntlmAuthenticator); 
    options.setProperty(HTTPConstants.CHUNKED, "false"); 
    return stub; 
    } catch (AxisFault e) { 
     e.printStackTrace(); 
    } 
     return null; 
} 

這將返回一個有效的SerivceStub對象。當我嘗試在存根上調用通話時,我在日誌中看到以下內容:

Jun 9, 2010 12:12:22 PM org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme 
INFO: NTLM authentication scheme selected 
Jun 9, 2010 12:12:22 PM org.apache.commons.httpclient.HttpMethodDirector authenticate 
SEVERE: Credentials cannot be used for NTLM authentication: org.apache.commons.httpclient.UsernamePasswordCredentials 

有沒有人有解決此問題的方法?

+1

我想我找到了答案。不要使用Axis。 Axis表示它支持NTLM,但它需要證書。在我們需要環境證書的SSO環境中,這沒有用處。這對於Java 6中的Axis來說應該是一個簡單的解決方案,因爲Java 6自帶了NTLM,但我想他們並不在乎。 我會嘗試CXF - 這應該工作...或者至少我希望它。 – andyczerwonka 2010-06-10 20:03:59

+0

如果您需要NTLM,CXF可以正常工作。 – andyczerwonka 2010-06-11 04:02:10

+1

CXF中沒有用於處理NTLM的代碼。這取決於JDK提供的NTLM支持。在使用CXF處理NTLM時,我們必須設置httpClientPolicy.setAllowChunking(false);.沒有這個屬性集,它就無法工作。 – 2011-05-05 00:41:28

回答

3

試試這個:http://robaustin.wikidot.com/axis 它適合我。你需要調用的getService前setupCertsAndCredential()()

private void setupCredential() { 
    final NTCredentials nt = new NTCredentials("user", "pass", "", "domain"); 
    final CredentialsProvider myCredentialsProvider = new CredentialsProvider() { 
    public Credentials getCredentials(AuthScheme scheme, String host, int port, boolean proxy) throws CredentialsNotAvailableException { 
    return nt; 
    } 
    }; 
    DefaultHttpParams.getDefaultParams().setParameter("http.authentication.credential-provider", myCredentialsProvider); 
} 

ServiceStub getService() { 

    try { 
    ServiceStub stub = new ServiceStub( 
     "http://myserver/some/path/to/webservices.asmx"); // this service is hosted on IIS 

    return stub;  
    } catch (AxisFault e) {  
     e.printStackTrace();  
    }  
     return null;  
}  
+0

正如我在文章中提到的,我想使用環境NTLM。你的帖子是錯誤的,因爲我只是想傳遞他們時必須提供證書。 Axis不支持這個,所以我跟CXF一起去了。 – andyczerwonka 2010-12-13 21:49:41

0

HttpClient的犯規支持NTLM V2因此我使用JCIFS庫返回NTLM v1,2,3消息類型在本網站

http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

描述

我剛剛使用上述網站的JCIFS_NTLMScheme.java文件註冊認證方案,它的工作原理!

樣品的客戶:

List authSchema = new ArrayList(); 
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, org.tempuri.JCIFS_NTLMScheme.class); 
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator(); 
auth.setUsername(""); 
auth.setPassword(""); 
auth.setDomain(""); 
auth.setHost(""); 
auth.setPort(); 
List authPrefs = new ArrayList(1); 
authPrefs.add(AuthPolicy.NTLM); 
auth.setAuthSchemes(authPrefs); 
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);