2013-08-30 16 views
16

मैं एक HTML5 मोबाइल ऐप विकसित कर रहा हूं, जो WebServices के साथ संचार करता है। वेब सर्विसेज एनटीएलएम प्रमाणीकरण प्रोटोकॉल का उपयोग करते हैं। मुझे जावास्क्रिप्ट के माध्यम से हैंडशेक को संभालने में कठिनाइयों का सामना करना पड़ रहा है। एनटीएलएम मेरे पोस्ट के जवाब के रूप में 401 unauthorized भेजता है, जिसे मुझे जवाब देने का कोई तरीका नहीं मिला है।जावास्क्रिप्ट/अजाक्स एनटीएलएम प्रमाणीकरण

क्या जावास्क्रिप्ट के साथ एनटीएलएम प्रमाणीकरण संभव है? क्या मुझे प्रॉक्सी वेब सेवा बनाना चाहिए उदा। बीच में बुनियादी प्रमाणीकरण?

मेरी jQuery कॉल कुछ की तरह जहां तक ​​मैंने देखा है, कोई भी AJAX के साथ विंडोज एकीकृत/NTLM प्रमाणीकरण लागू किया गया है है ...

$.ajax({ 
        type: "POST", 
        url: URL, 
        contentType: "text/xml", 
        dataType: "xml", 
        data: soapRequest, 
        username: 'username', 
        password: 'password', 
        xhrFields: { 
         withCredentials: true 
        }, 
        success: processSuccess, 
        error: processError 
}); 

उत्तर

4

, हालांकि यह संभव हो जाना चाहिए (मैं कर रहा पर विचार कर रहा हूँ यह एक चालू परियोजना) WindowsTokenRoleProvider साथ प्रपत्र प्रमाणीकरण गठबंधन करने के लिए के लिए

बुनियादी कार्यप्रवाह चाहिए टूटने इस तरह (लेख here और here) के आधार पर:

  1. "प्राधिकरण" शीर्षक में एक बेस 64 एन्कोडेड टाइप -1 NTLM संदेश गए एक GET अनुरोध कर
  2. "WWW-प्रमाणित" शीर्षक से बाहर base64 एनकोडेड टाइप -2 NTLM संदेश ले 401 प्रतिक्रिया में।
  3. noonce पिछले चरण में प्राप्त पर NTLM कार्रवाई करने
  4. "प्राधिकरण" शीर्षक में एक बेस 64 एन्कोडेड प्रकार -3 NTLM संदेश के साथ एक अंतिम प्राप्त प्रदर्शन (खेद मैं एक कोड उदाहरण अभी तक नहीं है) । यह 200.

HTTP पर एनटीएलएम ऑथ HTTP का उपयोग कर एक CHAP कार्यान्वयन से अधिक है, यह एक अधिकृत HTTP अनुरोध है।

यदि मैं वास्तव में इसे लागू करने के लिए वास्तव में मिलता हूं तो मैं आपको अपडेट करूंगा। क्षमा करें मैं और अधिक मदद नहीं कर सका।

+2

महान सारांश, कार्यान्वयन की सराहना करेंगे ... –

2

समस्या यह है कि आप वर्तमान में जावास्क्रिप्ट के माध्यम से डोमेन/उपयोगकर्ता में लॉग इन नहीं कर सकते (या यदि आप कभी समाधान नहीं ढूंढ सकते हैं)।

आप पहले से ही डोमेन, उपयोगकर्ता नाम और पासवर्ड आप की तरह https://github.com/erlandranvinge/ntlm.js/tree/master

कुछ इस्तेमाल कर सकते हैं लेकिन मैं एकल साइन के लिए इस विधि नीचे जा रहा लगता है पर लंबे समय में निराशा होने जा रहा है पता है।

हम छिपे हुए आईफ्रेम में एनटीएलएम प्रमाणीकरण कर रहे हैं और जावास्क्रिप्ट के माध्यम से आईफ्रेम एक्सेस कर रहे हैं।

+0

यह अच्छा है, टिप्पणी है: CORS (या JSONP) करने के लिए इस जहाँ तक मैं बता सकता है का उपयोग कर एक तरीका नहीं है। – Gram

0

आपको एनटीएलएम (एकीकृत विंडोज प्रमाणीकरण) चुनौती का जवाब नहीं देना है, अगर आपके ब्राउज़र को ठीक से कॉन्फ़िगर किया गया है, तो आपके ब्राउज़र को यह आपके लिए करना चाहिए। कई अतिरिक्त जटिलताओं की भी संभावना है।

चरण 1 - ब्राउज़र

चेक कि ब्राउज़र के लिए उपयोग और एक NTLM वेब अनुप्रयोग के साथ या सॉफ्टवेयर आप सीधे पहले विकसित कर रहे हैं मारकर अपने क्रेडेंशियल भेज सकते हैं।

चरण 2 - जावास्क्रिप्ट withCredentials

401 अनधिकृत त्रुटि प्राप्त विशेषता और लक्षण वर्णित बिल्कुल वैसा ही है जब मैं 'सही' के लिए 'withCredentials' विशेषता सेट करने में विफल रहा है। मैं jQuery से परिचित नहीं हूं, लेकिन सुनिश्चित करें कि उस विशेषता को सेट करने का आपका प्रयास सफल रहा है।

यह उदाहरण मेरे लिए काम करता है:

var xhttp = new XMLHttpRequest(); 
xhttp.open("GET", "https://localhost:44377/SomeService", true); 
xhttp.withCredentials = true; 
xhttp.send(); 
xhttp.onreadystatechange = function(){ 
    if (xhttp.readyState === XMLHttpRequest.DONE) { 
    if (xhttp.status === 200) 
     doSomething(xhttp.responseText); 
    else 
     console.log('There was a problem with the request.'); 
    } 
}; 

चरण 3 - सर्वर साइड CORS (वैकल्पिक)

मुझे लगता है एक प्रमुख कारण लोग इस सवाल पर पहुंचते हैं कि वे एक विकसित कर रहे हैं सक्षम अन्यथा होस्ट किए गए किसी अन्य घटक के साथ उनके वर्कस्टेशन पर घटक। यह Cross-Origin Resource Sharing (CORS) मुद्दों का कारण बनता है। दो समाधान हैं:

  1. अपने ब्राउज़र में सीओआरएस को अक्षम करें - विकास के लिए अच्छा है जब आखिरकार आपका काम उसी स्रोत पर तैनात किया जाएगा, जिस पर आपका कोड एक्सेस हो रहा है।
  2. अपने सर्वर पर सीओआरएस सक्षम करें - व्यापक इंटरनेट पर पर्याप्त पठन है, लेकिन इसमें मूल रूप से सीओआरएस सक्षम करने वाले शीर्षलेख भेजना शामिल है।

संक्षेप में, पहचान के साथ CORS सक्षम करने के लिए आप करना होगा:

  • एक 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति' शीर्षक है कि सेवा की पेज की उत्पत्ति से मेल खाता है भेजें ... इस नहीं किया जा सकता '*'
  • भेजें एक 'पहुंच-नियंत्रण-अनुमति दें-क्रेडेंशियल' मूल्य के साथ 'सही'

यहाँ मेरी Global.asax फ़ाइल में मेरे कार्य नेट कोड नमूना है। मुझे लगता है कि क्या हो रहा है यह देखने में बहुत आसान है और यदि आवश्यक हो तो अन्य भाषाओं में अनुवाद करें।

void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (Request.HttpMethod == "OPTIONS") 
    { 
     Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); 
     Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
     Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     Response.End(); 
    } 
    else 
    { 
     Response.AddHeader("Access-Control-Allow-Credentials", "true"); 

     if (Request.Headers["Origin"] != null) 
      Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]); 
     else 
      Response.AddHeader("Access-Control-Allow-Origin" , "*"); // Last ditch attempt! 
    } 
} 
संबंधित मुद्दे