在Java中抑制NTLM Auth

时间:2012-05-25 08:02:56

标签: java ntlm urlconnection

我目前正在测试一个Web应用程序,并遇到了一个有趣的现象。在我的测试会话期间,我使用代理收集了URL。现在我想测试我的URL列表以进行匿名访问,所以我写了这个小工具

    public static void main(String[] args) {
    try {
        TrustAllCerts.disableCertChecks();
        FileReader fr = new FileReader(new File("urls.txt"));
        BufferedReader br = new BufferedReader(fr);

        String urlStr = br.readLine();
        while (urlStr != null) {
            if (urlStr.trim().length() > 0) {
                URL url = new URL(urlStr);

                HttpsURLConnection urlc = (HttpsURLConnection) url.openConnection();
                urlc.connect();
                if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    System.out.println(urlStr);

                } else {
                    System.out.println("["+urlc.getResponseCode()+"] "+urlStr);
                }
                urlc.disconnect();
            }
            urlStr = br.readLine();
        }
        br.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

它什么都没做,但是在给定的URL上打开URL连接并测试HTTP响应代码(实际上我实现了一些更多的测试,如果我被重定向到登录页面)。但是,问题是,此特定应用程序(某些自定义MS SQL Server Reporting Services)配置为使用NTLM WWW身份验证。如果我尝试使用Firefox访问某些URL,我会收到401 Unauthorized + login dlg。 Internet Exploder在后台执行NTLM身份验证并授予访问权限。似乎Java URLConnection(或URL)类做了同样的事情,因为我没有得到401.有没有办法在Java中禁用隐式NTLM身份验证?这对我来说是一个不好的陷阱。

2 个答案:

答案 0 :(得分:1)

我认为Java Network Documentation是最好的资源。设置http.auth.preference="basic"可以获得您想要的效果。假设你不需要消化或其他东西。我不确定你是否可以超越它来禁用NTLM。

另一件需要考虑的事情是其他Java HTTP客户端实现,如Apache或Google。

答案 1 :(得分:0)

我不确定这会有所帮助,但我却被相反的情况所困扰。

想要 NTLM auth发生,所以在我的本地机器上我使用一个名为CNTLM的免费应用程序。它是一个本地代理服务器,它将转发(和NT auth)传入的请求。适用于无法使用NTLM代理的应用程序。

对不起,我知道这不是回答你的问题,但也许对那里的人有帮助! :)