NTLM-аутентификация с httpclient 4.2.1

Мне нужно выполнить HTTP GET для URL-адреса, для которого требуется проверка подлинности NTLM. Я могу получить доступ к URL-адресу с помощью Firefox или Chrome на MacBook Pro. Браузер запрашивает комбинацию имени пользователя и пароля, и он работает. Теперь я пытаюсь сделать то же самое в Groovy с помощью HttpClient. Я следовал руководству по поддержке NTLM, но всегда получаю 401 Unauthorized обратно. В ответе тоже есть это предложение:

У вас нет разрешения на просмотр этого каталога или страницы с использованием предоставленных вами учетных данных, потому что ваш веб-браузер отправляет поле заголовка WWW-Authenticate, которое веб-сервер не настроен для приема.

Я пробовал всевозможные комбинации для имени сервера и домена (удаленный компьютер с Windows не находится в домене) в этом фрагменте кода, но всегда получаю один и тот же ответ.

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

У кого-нибудь была такая же проблема и удалось ее решить? Обратите внимание, что это внешняя программа, которая использует IIS под капотом, поэтому я не думаю, что могу там изменить какие-либо настройки.

РЕДАКТИРОВАТЬ:

В отличие от того, что я сказал, мне удалось изменить настройки безопасности в IIS, чтобы принять аутентификацию BASIC, поэтому у меня больше нет проблемы.


person Wim Deblauwe    schedule 04.10.2012    source источник


Ответы (2)


РЕДАКТИРОВАТЬ:

По моему опыту настройки 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 вам по-прежнему нужен плагин для успешного запуска Firefox с NTLM.

person Daniel Baktiar    schedule 04.10.2012
comment
Мой MacBook Pro работает под управлением OS X 10.8.2, а не Windows. - person Wim Deblauwe; 04.10.2012
comment
Тогда вам придется преодолеть больше препятствий ... См. Мои отредактированные комментарии. - person Daniel Baktiar; 04.10.2012
comment
Mac не обязательно должен быть присоединен к домену для NTLM (но для Kerberos). NTLM может выполнять аутентификацию с использованием имени пользователя и пароля. Если вы вошли в Windows, он попытается использовать текущие учетные данные вашего сеанса, если это не удастся, он предложит. Совершенно уместно передавать DOMAIN \ имя пользователя и пароль в NTLM, особенно на машинах, отличных от Windows. - person Edward Thomson; 04.10.2012
comment
Ах, теперь я понимаю. Эдвард, ты был прав. Я перепутал Kerberos и NTLM. - person Daniel Baktiar; 04.10.2012

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

}

person Smitesh    schedule 25.03.2017