【问题标题】:NTLM authentication with httpclient 4.2.1使用 httpclient 4.2.1 进行 NTLM 身份验证
【发布时间】:2012-10-04 12:07:02
【问题描述】:

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

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

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

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

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

编辑:

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

【问题讨论】:

    标签: java ntlm apache-httpclient-4.x


    【解决方案1】:

    编辑:

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

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

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

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

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

    【讨论】:

    • 我的 MacBook Pro 运行的是 OS X 10.8.2,而不是 windows。
    • 那么你有更多的障碍需要克服......请参阅我编辑的 cmets。
    • Mac 不需要为 NTLM 加入域(但需要为 Kerberos。)NTLM 可以使用用户名/密码执行身份验证。如果您登录到 Windows,它将尝试使用您会话的当前凭据,如果失败,它将提示。将 DOMAIN\用户名和密码传递给 NTLM 非常合适,尤其是在非 Windows 机器上。
    • 啊,现在我明白了。爱德华,你是对的。我在 Kerberos 和 NTLM 之间混淆了。
    【解决方案2】:

    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();
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多