You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:21:23