HTTP-запрос авторизуется и не авторизуется в разных средах с одинаковой настройкой - PullRequest
3 голосов
/ 11 июля 2019

У нас есть забавная ситуация, когда базовый HTTP-запрос GET не проходит авторизацию Windows NTLM на сервере IIS. В то же время у нас есть тот же код, запущенный в другой среде, которая успешно выполняется.

Когда мы повторяем запрос через браузер, он успешно выполняется.

Похоже, что код 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;
}

Явные вопросы для ответа: Как регистрировать / отслеживать / отлаживать информацию, используемую для аутентификации на стороне клиента? Любая подсказка будет оценена :)

Ответы [ 2 ]

1 голос
/ 15 июля 2019

Насколько я знаю, сами ванильные JDK не имеют встроенной поддержки NTLM. Это будет означать, что вам придется вручную подключать шаги протокола.

Я пишу это исходя из своего опыта: мне пришлось самому развернуть целый многоцелевой SPNEGO, который поддерживает Oracle и IBM JRE. Было (не) весело. Хотя это было только на стороне сервера, я помню, что эта функция отсутствовала и на стороне Java-клиента (поскольку это был SPNEGO, а не обычный NTLM, на стороне клиента был браузер, поэтому я мог пропустить эту часть) .

Возможно, это изменилось с новым клиентом HTTP в Java 11, у меня пока нет с этим никакого опыта.

0 голосов
/ 15 июля 2019

Чтобы отладить обмен аутентификацией, вы можете добавить параметр командной строки:

-Djavax.net.debug = ssl, рукопожатие.

Таким образом,для обоих клиентов вы будете шаг за шагом в процессе рукопожатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...