Как обеспечить аутентификацию NTLM при вызове любого URL?
У меня есть размещенный URL, который аутентифицируется с помощью ntlm (встроенная аутентификация Windows). Я на Windows и использую Java 1,8
URL url = new URL("someUrl");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// con.setInstanceFollowRedirects(false);
con.setRequestProperty("Content-Type", "application/json");
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// read response
...
in.close();
}else{
System.out.println("Error while fetching reponse, recieved response code " + responseCode);
}
Приведенный выше код работал до Java 1.8.0_181. С последующими обновлениями он начал давать сбой, я проверил с 191 и 201. Код все еще работает, если перенесен на 181. Я также пытался использовать Authenticator, но он не вызывается (не знаю почему) С помощью внутренней регистрации java я мог видеть следующее сообщение в журналах"NegotiateAuthentication: java.io.IOException: поддержка согласования не инициирована", и я получаю 401
Я ожидаю, что любой механизм, который поможет java самостоятельно договориться об аутентификации.
1 ответ
В заметках о выпуске Java это нигде не упоминается, но есть изменения в реализации аутентификации NTLM. Я отладил код Java и пришел к следующему В java.home/lib есть файл net.properties, который теперь упоминает следующее
#
# Transparent NTLM HTTP authentication mode on Windows. Transparent authentication
# can be used for the NTLM scheme, where the security credentials based on the
# currently logged in user's name and password can be obtained directly from the
# operating system, without prompting the user. This property has three possible
# values which regulate the behavior as shown below. Other unrecognized values
# are handled the same as 'disabled'. Note, that NTLM is not considered to be a
# strongly secure authentication scheme and care should be taken before enabling
# this mechanism.
#
# Transparent authentication never used.
#jdk.http.ntlm.transparentAuth=disabled
#
# Enabled for all hosts.
#jdk.http.ntlm.transparentAuth=allHosts
#
# Enabled for hosts that are trusted in Windows Internet settings
#jdk.http.ntlm.transparentAuth=trustedHosts
#
jdk.http.ntlm.transparentAuth=disabled
До jdk1.8.0_181 был обратный вызов аутентификации NTLM по умолчанию, который был полезен в процессе аутентификации NTLM.
Чтобы запустить приведенный выше код с jdk1.8.0_181, все, что вам нужно, это установить jdk.http.ntlm.transparentAuth для вашего процесса Java.
Если вы выбираете trustHosts, убедитесь, что URL-адрес добавлен в доверенный сайт Windows.