2013-02-22 24 views
11

Tôi muốn sử dụng xác thực Windows NTLM trong ứng dụng Java của mình để xác thực người dùng mạng nội bộ một cách minh bạch. Người dùng không nên nhận thấy bất kỳ xác thực nào nếu sử dụng trình duyệt của họ (đăng nhập một lần).Sử dụng xác thực NTLM trong các ứng dụng Java

Tôi đã tìm thấy một vài libs với sự hỗ trợ NTLM, nhưng không biết cái nào để sử dụng:

Bất kỳ đề xuất bắt đầu từ đâu?

+0

Cũng lưu ý rằng khi sử dụng NTLM để xác thực, những kẻ tấn công tích cực có thể [xác thực phiên của riêng họ] (http://static.usenix.org/event/sec10/tech/slides/geer.pdf) bằng cách thương lượng hợp lệ của người dùng với máy chủ. – Michael

Trả lời

10

Out of danh sách trên, chỉ ntlmv2-auth và Jespa hỗ trợ NTLMv2. Jespa là hoàn toàn khả thi nhưng thương mại. ntlmv2-auth Tôi đã không thử nhưng nó dựa trên các mã từ Liferay, mà tôi đã nhìn thấy làm việc trước đây.

'ntlm-authentication-in-java' chỉ là NTLMv1, cũ, không an toàn và hoạt động trong một số lượng môi trường suy giảm khi mọi người nâng cấp lên phiên bản Windows mới hơn. JCIFS đã từng sử dụng bộ lọc auth HTTP NTLMv1, nhưng nó đã bị loại bỏ trong các phiên bản sau, như cách nó được triển khai thực hiện với một cuộc tấn công trung gian trên giao thức không an toàn. (Điều này có vẻ đúng với 'ntlm-authentication-in-java'.)

Dự án 'spnego' là Kerberos không NTLM. Nếu bạn muốn sao chép đầy đủ IWA như IIS hiện nó, bạn cần phải hỗ trợ cả NTLMv2 và Kerberos ('NTLM' auth, 'Thương lượng' auth, NTLMSSP-in-SPNego auth và NTLM-giả mạo-as-Negotiate auth).

+1

Waffle cũng là một lựa chọn rất tốt cho các máy chủ WIndows, được sử dụng trong 3 năm, hàng ngàn lần đăng nhập trong ngày tại nhiều trang web không sao, hỗ trợ v2 –

+0

https://jcifs.samba.org/src/docs/faq.html#ntlmv2 > Q: jCIFS có hỗ trợ NTLMv2 không? > A: Có. Kể từ 1.3.0, JCIFS hỗ trợ đầy đủ NTLMv2 và sử dụng nó theo mặc định.' 'Lưu ý: Bộ lọc HTTP SSO NTLM được sử dụng để bao gồm với JCIFS không thể hỗ trợ NTLMv2.' – Nikhil

0

Tương đối từ danh sách bạn đã cung cấp, tôi sẽ đi với JCIFS. Thư viện đã trưởng thành và tài liệu của họ rất tốt. Để đầu nó đi họ đã phát hành khá thường xuyên, và người cuối cùng là Tháng Mười Một 2011.

Personal Experience: nó là khá dễ dàng để bắt đầu khi so sánh với những người khác tôi đã cố gắng (Spnego và ntmv2auth)

+1

JCIFS không hỗ trợ NTLMv2 (tức là Windows 7/8), trừ khi được bật một cách rõ ràng trên máy khách thông qua Chính sách toàn cầu hoặc thay đổi sổ đăng ký. –

+0

Bạn có thể làm rõ ý nghĩa của thiết lập rõ ràng trong Windows 7/8 không? –

+0

@MiroslavLigas. Tôi nghĩ rằng anh ta có nghĩa là Win 7/8 không còn sử dụng NTLMv1 vì nó không được chấp nhận và được coi là mở để khai thác. Bây giờ nếu JCIFS chỉ hỗ trợ NTLMv1 thì bạn sẽ cần phải ép buộc các máy tính để bàn Win 7/8 của bạn cho phép sử dụng NTLMv1 (được thực hiện bởi một thay đổi đối với Win Registry) để các máy tính để bàn đó hoạt động với JCIFS. Trong hầu hết các công ty, quản trị viên sẽ không bao giờ cho phép thay đổi như vậy. Đối với tất cả các mục đích thực tế NTLMv1 đã chết! – peterh

3

Kịch bản của Luigi Dragone thực sự cũ và dường như luôn thất bại.

HttpURLConnection thể làm việc với NTLM nếu bạn thêm thư viện jcifs, ví dụ này làm việc với các mới nhất 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); 
     } 
    } 
} 

Và nếu bạn tò mò về nội dung của từng cái bắt tay, bạn có thể tìm thấy một ví dụ khác sử dụng JCIFS và Socket trên số thread này.

+0

Bạn có thể làm cho URL đó rõ ràng hơn một chút hay không , Ý tôi là cách chuyển tên người dùng và mật khẩu – Sony

+1

% 5C là dấu gạch chéo ngược. Ví dụ: h-t-t-p: // CORP \ username: [email protected]/ – ron190

+0

Phương pháp đầu tiên cho tôi vấn đề với các url phức tạp, nhưng nhận xét Method2 hoạt động tốt bằng cách sử dụng Java 1.7 và jcifs 1.3.17 so với IIS trên Windows Server 2012. – rwheadon

0

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

Q: Có hỗ trợ JCIFS NTLMv2?
A: Có. Tính đến 1.3.0, JCIFS hỗ trợ đầy đủ NTLMv2 và sử dụng nó theo mặc định.

Lưu ý: Bộ lọc HTTP SSO NTLM được sử dụng kèm theo JCIFS không thể hỗ trợ NTLMv2.