Axis 1.4客户端调用IIS上带NTLM认证的.NET Web服务遇401未授权求助
解决Axis 1.4调用NTLM认证的.NET IIS Web服务返回401的问题
我之前也碰到过类似的坑——Axis 1.4自带的HTTP客户端对NTLM认证的支持很有限,尤其是面对IIS上的.NET Web服务时,单纯用setUsername()和setPassword()根本搞不定HTTP层面的NTLM挑战-响应流程。下面是几个经过验证的解决方法:
方法一:切换到Apache Commons HttpClient(最常用)
Axis 1.4支持通过配置切换到Commons HttpClient,这个客户端对NTLM的兼容性好很多。
步骤1:确保依赖到位
首先要把Commons HttpClient的相关jar包加入项目,推荐用commons-httpclient 3.1版本(和Axis 1.4兼容性最佳),同时还要配套commons-codec和commons-logging的对应版本。
步骤2:修改客户端代码
只需要在原代码里添加几行配置,让Axis使用Commons HttpClient:
final String authUser = "username"; final String authPassword = "password"; Stub client = new Stub(); client._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, url); // 关键:启用Commons HttpClient支持NTLM client._setProperty(org.apache.axis.transport.http.HTTPConstants.USE_COMMONS_HTTP_CLIENT, Boolean.TRUE); // 可选:强制使用NTLMv2(如果IIS只允许v2的话) client._setProperty(org.apache.commons.httpclient.params.HttpClientParams.NTLM_AUTH_POLICY, "NTLMv2"); // 设置凭证(Commons HttpClient会自动处理HTTP层面的认证) client.setUsername(authUser); client.setPassword(authPassword); Output output = client.getService();
方法二:自定义HttpClient实例(更灵活)
如果方法一还是不行,可以手动创建HttpClient实例并配置认证策略,再传给Axis:
final String authUser = "username"; final String authPassword = "password"; // 1. 创建并配置HttpClient org.apache.commons.httpclient.HttpClient httpClient = new org.apache.commons.httpclient.HttpClient(); // 设置全局凭证 org.apache.commons.httpclient.UsernamePasswordCredentials creds = new org.apache.commons.httpclient.UsernamePasswordCredentials(authUser, authPassword); httpClient.getState().setCredentials(org.apache.commons.httpclient.auth.AuthScope.ANY, creds); // 指定NTLM版本为v2 httpClient.getParams().setParameter( org.apache.commons.httpclient.params.HttpClientParams.NTLM_AUTH_POLICY, "NTLMv2" ); // 2. 配置Axis Stub使用自定义HttpClient Stub client = new Stub(); client._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, url); client._setProperty(org.apache.axis.transport.http.HTTPConstants.CUSTOM_HTTP_CLIENT, httpClient); Output output = client.getService();
额外检查项
除了客户端代码,还要确认IIS的配置没问题:
- 确保Web站点启用了NTLM认证(禁用匿名认证,或者至少把NTLM加到认证列表里);
- 确认你用的账号有访问该Web服务的权限(在IIS的“权限”设置里添加该用户,或者用户属于允许访问的组);
- 如果IIS服务器要求NTLMv2,客户端必须对应开启v2的配置(就是上面代码里的
NTLM_AUTH_POLICY设置)。
为什么之前非.NET无认证的服务能正常工作?因为Axis默认的客户端能处理基本认证或者无认证的场景,但NTLM是基于挑战-响应的复杂认证机制,默认客户端不支持这种流程。
内容的提问来源于stack exchange,提问作者giuls26
相关产品推荐
相关产品推荐

