3

我们有一个有趣的情况,基本的 GET HTTP 请求没有通过 IIS 服务器上的 Windows NTLM 授权。同时,我们在另一个成功执行的环境中运行相同的代码。

当我们通过浏览器重复请求时,它会成功执行。

似乎 Java 代码没有随请求发送正确的授权信息。我们正试图弄清楚这是怎么回事。使用的类来自java.net包。我们尝试将帐户切换到本地系统,在该系统下 Tomcat 来回运行但没有成功。

代码尽可能简单:

public static String sendHttpRequest(String urlString, String method, boolean 
disconnect) {

    HttpURLConnection urlConnection = null;
    String result = null;
    try {

        URL url = new URL(urlString);

        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.addRequestProperty("Content-Length", "0");

        urlConnection.setRequestMethod(method);
        urlConnection.setUseCaches(false);

         StringBuilder sb = new StringBuilder();
        try (InputStream is = urlConnection.getInputStream()) {

             InputStream buffer = new BufferedInputStream(is);
            Reader reader = new InputStreamReader(buffer, "UTF-8");
            int c;

            while ((c = reader.read()) != -1) {
                sb.append((char) c);
            }
        }

        int statusCode = urlConnection.getResponseCode();
        if (statusCode < 200 || statusCode >= 300) {

        } else
            result = sb.toString();

    } catch (IOException e) {
        LOGGER.warning(e.getMessage());
    } finally {
        if (disconnect && urlConnection != null) {
            urlConnection.disconnect();
        }
    }

    return result;
}

要回答的明确问题:如何在客户端记录/跟踪/调试用于身份验证的信息?任何提示将不胜感激:)

4

3 回答 3

1

据我所知,普通 JDK 本身没有内置的 NTLM 支持。这意味着您必须自己手动连接协议的步骤。

我是根据我的经验写这篇文章的:我必须自己推出一个完整的多轮 SPNEGO,它支持 OracleIBM JRE。是(不)有趣的。虽然这只是服务器端的乐趣,但我记得偶然发现 Java 客户端也缺少这个功能(因为它是 SPNEGO 而不是普通的 NTLM,客户端是浏览器,所以我可以跳过那部分) .

这可能随着 Java 11 中的新 HTTP 客户端而改变,我对此还没有任何经验。

于 2019-07-15T10:39:47.523 回答
1

在 Windows 操作系统上运行时,较新版本的 Apache HttpClient 通过 JNA 通过 SSPI 支持本机 Windows Negotiate、Kerberos 和 NTLM。因此,如果您可以选择使用较新的版本(我相信从 4.4 开始),这不是问题。

例如: http ://hc.apache.org/httpcomponents-client-4.4.x/httpclient-win/examples/org/apache/http/examples/client/win/ClientWinAuth.java

于 2021-01-28T12:20:15.017 回答
-1

为了调试您的身份验证交换,您可以添加命令行参数:

-Djavax.net.debug=ssl,握手。

这样,您将在握手过程中逐步为两个客户提供服务。

于 2019-07-15T14:06:54.500 回答