我瀏覽過關於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
有沒有人有解決此問題的方法?
我想我找到了答案。不要使用Axis。 Axis表示它支持NTLM,但它需要證書。在我們需要環境證書的SSO環境中,這沒有用處。這對於Java 6中的Axis來說應該是一個簡單的解決方案,因爲Java 6自帶了NTLM,但我想他們並不在乎。 我會嘗試CXF - 這應該工作...或者至少我希望它。 – andyczerwonka 2010-06-10 20:03:59
如果您需要NTLM,CXF可以正常工作。 – andyczerwonka 2010-06-11 04:02:10
CXF中沒有用於處理NTLM的代碼。這取決於JDK提供的NTLM支持。在使用CXF處理NTLM時,我們必須設置httpClientPolicy.setAllowChunking(false);.沒有這個屬性集,它就無法工作。 – 2011-05-05 00:41:28