我需要将Apache Axis 1.4连接到使用NTLM身份验证来限制对其操作的访问的Web服务.我期待使用Samba Jcifs来处理NTLM握手.
我发现
http://hc.apache.org/httpcomponents-client/ntlm.html
这为我提供了如何使用jcifs连接HttpClient 4.0的绝佳方向.
麻烦的是,Axis希望使用Http Client 3.0并且两个apis看起来非常不同.
我可以看到两种可能性
数字1.看起来不平凡,但可能是2号.我在网上找不到任何令人鼓舞的消息,描述如何做到这一点.
我的问题是:有没有人成功连接samba jcifs与HttpClient 3.0?有没有人已经创建了一个与HttpClient 4一起使用的Axis HttpSender对象?
还有一些我没有考虑过的更好的选择吗?
最后有一个解决方案.
Apache Axis使用Apache HTTPClient
,它提供自己的NTLM实现.
但是这种实施是不完整的; 它只支持原始的LM认证.
我需要连接的系统坚持更新的NTLM身份验证.
因此,在将Apache HTTP Client与NTLM一起使用时,我的Web服务无法进行身份验证.
这实际上然后进入无限循环,因为HTTPClient
它将永远不会停止尝试并且无法进行身份验证.
jcifs完全支持NTLM握手的所有3个版本.
我已经复制并粘贴org.apache.commons.httpclient.auth.NTLM
到我自己的类中(为了击败继承,它被声明为'final')
然后我覆盖了这个方法
public String getType3Message(
String user, String password, String host, String domain,
byte[] nonce) throws AuthenticationException
Run Code Online (Sandbox Code Playgroud)
构造一个实例jcifs.ntlmssp.Type3Message
并使用该对象返回一个Type3Message
正确生成NTML身份验证的对象.
然后我需要创建自己的实例org.apache.commons.httpclient.auth.AuthScheme
来使用这个新的NTLM实现.呼叫
org.apache.commons.httpclient.auth.AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, MyNewAuthScheme.class)
启动我的WS端点存根.
它的工作原理!