2013-02-22 4 views
11

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

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

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

+0

Также имейте в виду, что при использовании NTLM для аутентификации активные злоумышленники могут [аутентифицировать свой собственный сеанс] (http://static.usenix.org/event/sec10/tech/slides/geer.pdf), используя действительные пользовательские переговоры с сервером. – Michael

ответ

10

Из в приведенном выше списке, только 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).

+1

Вафли также являются очень хорошим вариантом только для серверов WIndows, которые используют в течение 3 лет, тысячи логинов в день на нескольких сайтах нет проблем, поддерживает v2 –

+0

https://jcifs.samba.org/src/docs/faq.html#ntlmv2 В: Поддерживает ли поддержка jCIFS NTLMv2? > A: Да. Начиная с версии 1.3.0, JCIFS полностью поддерживает NTLMv2 и использует его по умолчанию. ' ' Примечание: NTLM HTTP SSO Filter, который ранее был включен в JCIFS, не может поддерживать NTLMv2.' – Nikhil

0

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

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

+1

JCIFS не поддерживает NTLMv2 (то есть Windows 7/8), если явно не разрешено на клиентских компьютерах через глобальную политику или изменение реестра. –

+0

Не могли бы вы пояснить, что вы подразумевали под явной настройкой в ​​Windows 7/8? –

+0

@MiroslavLigas. Я думаю, что он означает, что Win 7/8 больше не использует NTLMv1, поскольку он устарел и считается открытым для эксплойтов. Теперь, если JCIFS поддерживает только NTLMv1, вам необходимо заставить ваши рабочие станции Win 7/8 разрешить использование NTLMv1 (что делается путем изменения в Win Registry), чтобы эти рабочие столы работали с JCIFS. В большинстве компаний администратор никогда не допустит такого изменения. Для всех практических целей NTLMv1 мертв! – peterh

3

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

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 и гнезда на этом thread.

+0

Можете ли вы сделать эту часть URL немного более понятной , Я имею в виду, как передать имя пользователя и пароль – Sony

+1

% 5C - обратная косая черта. например, h-t-t-p: // CORP \ имя пользователя: [email protected]/ – ron190

+0

Первый метод дал мне проблемы со сложными URL-адресами, но закомментированный метод Method2 хорошо работает с использованием Java 1.7 и jcifs 1.3.17 в отношении IIS на Windows Server 2012. – rwheadon

0

Ref: https://jcifs.samba.org/src/docs/faq.html#ntlmv2

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

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

Смежные вопросы