3

我需要对需要 NTLM 身份验证的 URL 执行 HTTP GET。我可以在 MacBook Pro 上使用 Firefox 或 Chrome 访问该 URL。浏览器要求输入用户名/密码组合并且它可以工作。我现在正在尝试使用 HttpClient 从 Groovy 做同样的事情。我遵循了NTLM 支持指南,但我总是得到401 Unauthorized回报。回复中还有这句话:

您无权使用您提供的凭据查看此目录或页面,因为您的 Web 浏览器正在发送 Web 服务器未配置为接受的 WWW-Authenticate 标头字段。

我在这段代码中尝试了服务器名和域的各种组合(远程 windows pc 不在域上),但我总是得到相同的响应。

httpclient.getCredentialsProvider().setCredentials(
new AuthScope("myserver", -1), 
new NTCredentials("username", "password", "MYSERVER", "MYDOMAIN"));

有人遇到同样的问题并设法解决了吗?请注意,这是一个在后台使用 IIS 的外部程序,所以我认为我不能在那里更改任何设置。

编辑:

与我所说的不同,我设法将 IIS 中的安全设置更改为接受 BASIC 身份验证,所以我不再遇到问题了。

4

2 回答 2

0

编辑:

根据我设置 Kerberos 或 NTLM(两者都是单点登录)的经验,当您已经登录到系统时,您根本不必输入用户名/密码。

我很确定当浏览器询问用户名/密码组合时,这根本不是 NTLM 身份验证。服务器端应用程序很可能具有 HTTP Basic Digest 的后备方案(这就是它显示用户名/密码组合的原因)。使用 NTLM,您根本无需输入用户名/密码(主体/凭据),因为服务器将通过浏览器、操作系统、服务器和 Active Directory 服务器之间的协商机制识别您的身份。

如果您的 MacBook Pro 在 OS/X 上运行,您还需要将您的 OS/X 添加到域中。您的服务器还需要位于添加客户端 OS/X 的同一域中。这可能不是一件小事。可能需要一些外部工具/驱动程序。这个可能是一个很好的候选人(但我没有尝试过)。

NTLM 需要两个客户端都是与服务器相同的域的成员,因此两者都需要在 Active Directory 域中注册。如果您的服务器不在域中,那将是另一组问题。

为了让您的浏览器与 NTLM 一起工作,您需要安装插件 (ntlmauth-plugin?)。但我还没有在 MacOS/X 上尝试过。即使在 Windows 中,您仍然需要一个插件才能使用 NTLM 成功运行 Firefox。

于 2012-10-04T12:22:55.900 回答
0

HttpClient 对我不起作用,但最后下面的代码起作用了。参考 - http://docs.oracle.com/javase/7/docs/technotes/guides/net/http-auth.html

快速参考 -

public static String getResponse(String url, String userName, String password) throws IOException {
Authenticator.setDefault(new Authenticator() {
  @Override
  public PasswordAuthentication getPasswordAuthentication() {
    System.out.println(getRequestingScheme() + " authentication");
    return new PasswordAuthentication(userName, password.toCharArray());
  }
});

URL urlRequest = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("GET");

StringBuilder response = new StringBuilder();
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();

}

于 2017-03-25T21:05:16.943 回答