Подтвердить что ты не робот

Использование аутентификации NTLM в приложениях Java

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

Я нашел несколько библиотек с поддержкой NTLM, но не знаю, какой из них использовать:

Любые предложения, с чего начать?

4b9b3361

Ответ 1

Из приведенного списка только ntlmv2-auth и Jespa поддерживают NTLMv2. Jespa работоспособен, но коммерчески. ntlmv2-auth Я не пробовал, но он основывался на коде Liferay, который я видел раньше.

'ntlm-authentication-in-java' - это только NTLMv1, который является старым, небезопасным и работает в сокращающемся количестве сред, когда люди обновляют до более новых версий Windows. У JCIFS использовался HTTP-фильтр NTLMv1 HTTP, но он был удален в более поздних версиях, так как способ, которым он был реализован, представляет собой атаку "человек-в-середине" на небезопасном протоколе. (То же самое похоже на "ntlm-authentication-in-java".)

Проект spnego - это Kerberos, а не NTLM. Если вы хотите реплицировать полный IWA, как это делает IIS, вам нужно будет поддерживать как NTLMv2, так и Kerberos ( "NTLM" auth, "Negotiate" auth, NTLMSSP-in-SPNego auth и NTLM-masquerading-as-Negotiate auth).

Ответ 2

Луиджи Драгон script действительно старен и, кажется, всегда терпит неудачу.

HttpURLConnection может работать с NTLM, если вы добавите библиотеку jcifs, этот пример работает с последними jcifs-1.3.18:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.impl.auth.NTLMEngineException;

public class TestNTLMConnection {
    public static void main(String[] args) throws UnknownHostException, IOException, NTLMEngineException {
        // Method 1 : authentication in URL
        jcifs.Config.registerSmbURLHandler();
        URL urlRequest = new URL("http://domain%5Cuser:[email protected]/");

        // or Method 2 : authentication via System.setProperty()
        // System.setProperty("http.auth.ntlm.domain", "domain");
        // System.setProperty("jcifs.smb.client.domain", "domain");
        // System.setProperty("jcifs.smb.client.username", "user");
        // System.setProperty("jcifs.smb.client.password", "pass");
        // Not verified // System.setProperty("jcifs.netbios.hostname", "host");
        // System.setProperty("java.protocol.handler.pkgs", "jcifs");
        // URL urlRequest = new URL("http://127.0.0.1:8180/simulate_get.php");

        HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection();

        StringBuilder response = new StringBuilder();

        try {
            InputStream stream = conn.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(stream));

            String str = "";
            while ((str = in.readLine()) != null) {
                response.append(str);
            }
            in.close();   

            System.out.println(response);
        } catch(IOException err) {
            System.out.println(err);
        } finally {
            Map<String, String> msgResponse = new HashMap<String, String>();

            for (int i = 0;; i++) {
                String headerName = conn.getHeaderFieldKey(i);
                String headerValue = conn.getHeaderField(i);
                if (headerName == null && headerValue == null) {
                    break;
                }
                msgResponse.put(headerName == null ? "Method" : headerName, headerValue);
            }

            System.out.println(msgResponse);
        }
    }
}

И если вам интересно о содержании каждого рукопожатия, вы можете найти еще один пример использования jcifs и Socket в этом потоке.

Ответ 3

Относительно из списка, который вы указали, я бы пошел с JCIFS. Библиотека зрелая, и их документация хороша. В довершение всего, у них были довольно регулярные релизы, а последний - ноябрь 2011 года.

Personal Experience: было довольно легко начать работу по сравнению с другими, которые я пробовал (spnego и ntmv2auth)

Ответ 4

Ссылка: https://jcifs.samba.org/src/docs/faq.html#ntlmv2

В: Поддерживает ли jCIFS NTLMv2?
A: Да. Начиная с версии 1.3.0, JCIFS полностью поддерживает NTLMv2 и использует его по умолчанию.

Примечание.. NTLM HTTP SSO Filter, который ранее был включен в JCIFS, не поддерживает NTLMv2.