我正在调用在IIS服务器下远程运行的.net编写的Web服务。
我用Eclipse IDE使用apache axis 1.4
创建了它的存根,并创建了一个Web服务客户端。这只是一个测试客户端,实际上它将是我的Web应用程序调用这个Web服务。
我们保留了它两个不同的端点,用于保持安全凭据的启用/禁用。
1.“ip:端口/鸽子/鸽子.svc;“//身份验证已禁用
1.“IP:端口/pwa/鸽子.svc;//启用身份验证
因此,现在当我使用端点no(1)时,我可以调用Web服务并完成任务,但由于我希望强制应用安全凭据,因此当我使用端点no(2)时,我会遇到以下异常
(401)未经授权
(401)未经授权的轴故障
错误代码:{http://xml.apache.org/axis/}HTTP
故障子代码:
错误字符串:(401)未经授权
故障执行元:
故障节点:
故障详细信息:{}:返回代码:401
我要传递此格式凭据:
1)域\用户名
2)口令
我试着在这里添加其他帖子的建议,说在存根中设置相应的调用前方法,但我得到了上面提到的相同的异常。
(mystub)._setProperty(javax.xml.rpc.存根.用户名_属性,域+“\”+用户名);
(我的存根)._setProperty(javax.xml.rpc.存根.密码_属性,密码);
然而,通过一些搜索,现在我能够通过调用我远程.net Web服务的java独立程序进行NTML身份验证,方法是:
public static void main(String[] args) throws Exception {
String urlStr = “http://example.com/root/action.dll?p1=value1″;
String domain = “”; // May also be referred as realm
String userName = “CHANGE_ME”;
String password = “CHANGE_ME”;
String responseText = getAuthenticatedResponse(urlStr, domain, userName, password);
System.out.println(”response: ” + responseText);
}
private static String getAuthenticatedResponse(final String urlStr, final String domain, final String userName, final String password) throws IOException {
StringBuilder response = new StringBuilder();
Authenticator.setDefault(new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(domain + “\\” + userName, password.toCharArray());
}
});
URL urlRequest = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod(”GET”);
InputStream stream = conn.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
String str = “”;
while ((str = in.readLine()) != null) {
response.append(str);
}
in.close();
return response.toString();
}
但是我不能用我的axis客户端来实现,因为存根是用我的web服务客户端中的.net web服务提供的wsdl生成的。我尝试在invoke()调用之前通过根据上面的演示进行修改来更改@stub level,但是它抛出了相同的未经授权的异常。
这只是对使用NTLM身份验证技术远程IIS服务器的一个参考。
需要有关使用java进行Windows身份验证的帮助,以便将安全凭据传递到IIS。
[注意:我的axis客户端(java)传递domain\user和密码,这是在另一端正确配置IIS服务器的]
1条答案
按热度按时间7gcisfzg1#
问题是Axis 1.4没有正确实现NTLM V2协议。
我在使用Sharepoint 2010 Web服务时遇到了问题。我有一个客户端在Windows 2003服务器上运行Sharepoint 2007时工作正常。然后,我使用在Windows 2008 R2服务器上运行的Sharepoint 2010 Web服务测试了此客户端,结果服务停止工作。错误为:
在谷歌搜索,问题是Windows 2003使用NTLM V1协议作为默认协议,而Windows 2008 R2使用NTLM V2作为默认协议。
我在下面的网址找到了解决方案和问题的完美解释:
http://devsac.blogspot.com.es/2010/10/supoprt-for-ntlmv2-with-apache.html
解决方案正在创建以下类以解析HttpClient 3.x:
}
然后使用以下命令将新的JCIFS_NTLMScheme类注册为NTLMScheme的替换类:
Thanks to Sachin's Tech Place