我正在尝试使用 Apache/Jakarta HttpClient 4.1.1 使用给定的凭据连接到任意网页。为了测试这一点,我在我的开发机器上安装了一个最小的 IIS 7.5,一次只有一种身份验证模式处于活动状态。基本身份验证工作正常,但每当我尝试登录时,Digest 和 NTLM 都会返回 401 错误消息。这是我的代码:
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpget = new HttpGet("http://localhost/");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
new NTCredentials("user", "password", "", "localhost"));
if (!new File(System.getenv("windir") + "\\krb5.ini").exists()) {
List<String> authtypes = new ArrayList<String>();
authtypes.add(AuthPolicy.NTLM);
authtypes.add(AuthPolicy.DIGEST);
authtypes.add(AuthPolicy.BASIC);
httpclient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF,
authtypes);
httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF,
authtypes);
}
localContext.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
HttpResponse response = httpclient.execute(httpget, localContext);
System.out.println("Response code: " + response.getStatusLine());
我在 Fiddler 中注意到的一件事是 Firefox 与 HttpClient 发送的哈希值不同,这让我认为 IIS 7.5 可能期望比 HttpClient 提供的哈希值更强?有任何想法吗?如果我能验证这是否适用于 NTLM,那就太好了。文摘也不错,但如果有必要,我可以不用它。