2013-02-22 17 views
11

मैं इंट्रानेट उपयोगकर्ताओं को पारदर्शी रूप से प्रमाणित करने के लिए अपने जावा एप्लिकेशन में विंडोज एनटीएलएम प्रमाणीकरण का उपयोग करना चाहता हूं। उपयोगकर्ताओं को अपने ब्राउज़र (सिंगल साइन-ऑन) का उपयोग करते हुए कोई प्रमाणीकरण नहीं दिखना चाहिए।जावा अनुप्रयोगों में एनटीएलएम प्रमाणीकरण का उपयोग

मैं NTLM समर्थन के साथ कुछ libs पाया है, लेकिन जो एक का उपयोग करना नहीं आता:

कोई सुझाव कहां से शुरू करें?

+0

यह भी ध्यान रखें कि प्रमाणीकरण के लिए एनटीएलएम का उपयोग करने में, सक्रिय हमलावर वैध उपयोगकर्ता की वार्ता का उपयोग कर [अपने स्वयं के सत्र को प्रमाणित कर सकते हैं] (http://static.usenix.org/event/sec10/tech/slides/geer.pdf) सर्वर के साथ। – Michael

उत्तर

10
से

की तुलना में काफी आरंभ करने के लिए आसान था उपरोक्त सूची, केवल ntlmv2-auth और Jespa NTLMv2 का समर्थन करते हैं। जेस्पा काम करने योग्य लेकिन वाणिज्यिक है। ntlmv2-auth मैंने कोशिश नहीं की है लेकिन यह Liferay के कोड पर आधारित है, जिसे मैंने पहले काम देखा है।

'एनटीएलएम-प्रमाणीकरण-इन-जावा' केवल एनटीएलएमवी 1 है, जो पुराने, असुरक्षित और वातावरण की घटती संख्या में काम करता है क्योंकि लोग नए विंडोज संस्करणों में अपग्रेड करते हैं। जेसीआईएफएस में एनटीएलएमवी 1 HTTP ऑथ फ़िल्टर होता था, लेकिन इसे बाद के संस्करणों में हटा दिया गया था, जिस तरह से इसे असुरक्षित प्रोटोकॉल पर मैन-इन-द-बीच हमले के लिए लागू किया गया था। (यह 'ntlm-प्रमाणीकरण-इन-जावा' के बारे में भी सच प्रतीत होता है।)

'स्प्नगो' प्रोजेक्ट केर्बेरो एनटीएलएम नहीं है। यदि आप आईआईएसए के रूप में पूर्ण आईडब्ल्यूए को दोहराना चाहते हैं, तो आपको एनटीएलएमवी 2 और केर्बेरोस ('एनटीएलएम' ऑथ, 'नेगोशिएट' ऑथ, एनटीएलएमएसएसपी-इन-एसपीएनगो एथ और एनटीएलएम-मास्कराइडिंग-ए-नेगोशिएट ऑथ दोनों का समर्थन करना होगा)।

+1

वफ़ल केवल विन्डोज सर्वर के लिए एक बहुत अच्छा विकल्प है, 3 वर्षों के लिए उपयोग कर रहा है, कई साइटों पर दिन के हजारों लॉगिन कोई समस्या नहीं, v2 –

+0

का समर्थन करता है https://jcifs.samba.org/src/docs/faq.html#ntlmv2 > प्रश्न: क्या जेसीआईएफएस एनटीएलएमवी 2 का समर्थन करता है? > ए: हां। 1.3.0 के अनुसार, जेसीआईएफएस पूरी तरह से एनटीएलएमवी 2 का समर्थन करता है और इसे डिफ़ॉल्ट रूप से उपयोग करता है। 'नोट: एनटीएलएम HTTP एसएसओ फ़िल्टर जिसे जेसीआईएफएस के साथ शामिल किया जाता था, NTLMv2 का समर्थन नहीं कर सकता। – Nikhil

0

आपके द्वारा दी गई सूची से अपेक्षाकृत, मैं JCIFS के साथ जाऊंगा। पुस्तकालय परिपक्व है, और उनका दस्तावेज अच्छा है। यह शीर्ष करने के लिए बंद वे काफी नियमित रिलीज हुई, और पिछले एक नवम्बर 2011

Personal Experience किया जा रहा है: यह जब दूसरों मैं कोशिश की है (SPNEGO और ntmv2auth)

+1

जेसीआईएफएस एनटीएलएमवी 2 (यानि विंडोज 7/8) का समर्थन नहीं करता है, जब तक कि वैश्विक नीति या रजिस्ट्री परिवर्तन के माध्यम से क्लाइंट मशीनों पर स्पष्ट रूप से सक्षम न हो। –

+0

क्या आप स्पष्ट कर सकते हैं कि विंडोज 7/8 में स्पष्ट सेटअप द्वारा आपका क्या मतलब है? –

+0

@ मिरोस्लाव लिगास। मुझे लगता है कि उनका मतलब है कि विन 7/8 अब NTLMv1 का उपयोग नहीं करता है क्योंकि इसे बहिष्कृत किया गया है और शोषण के लिए खुला माना जाता है। अब यदि जेसीआईएफएस केवल एनटीएलएमवी 1 का समर्थन करता है तो आपको अपने विन 7/8 डेस्कटॉप को एनटीएलएमवी 1 (जो विन रजिस्ट्री में बदलाव से किया जाता है) के उपयोग की अनुमति देने के लिए मजबूर करना होगा ताकि इस तरह के डेस्कटॉप जेसीआईएफएस के साथ काम कर सकें। ज्यादातर कंपनियों में व्यवस्थापक कभी भी इस तरह के बदलाव की अनुमति नहीं देगा। सभी व्यावहारिक उद्देश्यों के लिए एनटीएलएमवी 1 मर चुका है! – 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

क्या आप उस यूआरएल भाग को थोड़ा और स्पष्ट कर सकते हैं , मेरा मतलब है कि उपयोगकर्ता नाम और पासवर्ड कैसे पास करें – Sony

+1

% 5 सी बैकस्लैश है। उदाहरण के लिए एच-टी-टी-पी: // सीओआरपी \ उपयोगकर्ता नाम: [email protected]/ – ron190

+0

पहली विधि ने मुझे जटिल यूआरएल के साथ समस्याएं दीं, लेकिन टिप्पणी की गई कि विधि 2 जावा 1.7 का उपयोग करके अच्छी तरह से काम करता है और विंडोज सर्वर 2012 पर आईआईएस के खिलाफ 1.3.17 को jcifs करता है। – rwheadon

0

रेफरी: https://jcifs.samba.org/src/docs/faq.html#ntlmv2

प्रश्न: jCIFS समर्थन NTLMv2 करता है?
ए: हां। 1.3.0 के अनुसार, जेसीआईएफएस पूरी तरह से एनटीएलएमवी 2 का समर्थन करता है और डिफ़ॉल्ट रूप से इसका उपयोग करता है।

नोट: एनटीएलएम HTTP एसएसओ फ़िल्टर जिसे जेसीआईएफएस के साथ शामिल किया जाता था, NTLMv2 का समर्थन नहीं कर सकता।

संबंधित मुद्दे

 संबंधित मुद्दे