2009-06-16 19 views
29

मैं jQuery का उपयोग कर रहा है इस तरह एक नेट वेब सेवा को कॉल करने के लिए:मैं jQuery का उपयोग कर webservice के लिए विंडोज प्रमाणीकरण कैसे पास कर सकता हूं?

var service_url = "https://example.com/myservice.asmx" 
$.ajax({ 
    type: "GET", 
    url: service_url, 
    dataType: "xml", 
    data: "ParamId=" + FormId.value, 
    processData: false, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { ajaxError(XMLHttpRequest, textStatus, errorThrown); }, 
    success: function(xml) { DoSomething(xml); } 
}); 

अब मैं "https://example.com/myservice.asmx" रैप करने के लिए Windows प्रमाणीकरण में चाहते हैं। मैं jQuery/जावास्क्रिप्ट का उपयोग कर सेवा में प्रमाण-पत्र कैसे पास कर सकता हूं?

आदर्श रूप में मैं वर्तमान उपयोगकर्ता के प्रमाण-पत्रों का उपयोग करना चाहता हूं लेकिन यदि आवश्यक हो तो मैं सभी सेवा कॉल के लिए 1 मास्टर क्रेडेंशियल का उपयोग कर सकता हूं।

उत्तर

13

ऐसा लगता है कि आपको बेस 64 ऑथ डेटा मैन्युअल रूप से अनुरोध शीर्षलेख सेट करने की आवश्यकता है।

निर्देश यहां हैं: http://coderseye.com/2007/how-to-do-http-basic-auth-in-ajax.html

आप पहली बार यहां से निम्न कोड उठाने की जरूरत: बेस 64 एन्कोडिंग

/** 
* 
* Base64 encode/decode 
* http://www.webtoolkit.info/ 
* 
**/ 

var Base64 = { 

    // private property 
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=", 

    // public method for encoding 
    encode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = Base64._utf8_encode(input); 

     while (i < input.length) { 

      chr1 = input.charCodeAt(i++); 
      chr2 = input.charCodeAt(i++); 
      chr3 = input.charCodeAt(i++); 

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63; 

      if (isNaN(chr2)) { 
       enc3 = enc4 = 64; 
      } else if (isNaN(chr3)) { 
       enc4 = 64; 
      } 

      output = output + 
      this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + 
      this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); 

     } 

     return output; 
    }, 

    // public method for decoding 
    decode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3; 
     var enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 

     while (i < input.length) { 

      enc1 = this._keyStr.indexOf(input.charAt(i++)); 
      enc2 = this._keyStr.indexOf(input.charAt(i++)); 
      enc3 = this._keyStr.indexOf(input.charAt(i++)); 
      enc4 = this._keyStr.indexOf(input.charAt(i++)); 

      chr1 = (enc1 << 2) | (enc2 >> 4); 
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
      chr3 = ((enc3 & 3) << 6) | enc4; 

      output = output + String.fromCharCode(chr1); 

      if (enc3 != 64) { 
       output = output + String.fromCharCode(chr2); 
      } 
      if (enc4 != 64) { 
       output = output + String.fromCharCode(chr3); 
      } 

     } 

     output = Base64._utf8_decode(output); 

     return output; 

    }, 

    // private method for UTF-8 encoding 
    _utf8_encode : function (string) { 
     string = string.replace(/\r\n/g,"\n"); 
     var utftext = ""; 

     for (var n = 0; n < string.length; n++) { 

      var c = string.charCodeAt(n); 

      if (c < 128) { 
       utftext += String.fromCharCode(c); 
      } 
      else if((c > 127) && (c < 2048)) { 
       utftext += String.fromCharCode((c >> 6) | 192); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 
      else { 
       utftext += String.fromCharCode((c >> 12) | 224); 
       utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 

     } 

     return utftext; 
    }, 

    // private method for UTF-8 decoding 
    _utf8_decode : function (utftext) { 
     var string = ""; 
     var i = 0; 
     var c = c1 = c2 = 0; 

     while (i < utftext.length) { 

      c = utftext.charCodeAt(i); 

      if (c < 128) { 
       string += String.fromCharCode(c); 
       i++; 
      } 
      else if((c > 191) && (c < 224)) { 
       c2 = utftext.charCodeAt(i+1); 
       string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
       i += 2; 
      } 
      else { 
       c2 = utftext.charCodeAt(i+1); 
       c3 = utftext.charCodeAt(i+2); 
       string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
       i += 3; 
      } 

     } 

     return string; 
    } 

} 

तो फिर तुम प्रमाणन डेटा के निर्माण के लिए कोड की आवश्यकता होगी करने के लिए http://www.webtoolkit.info/javascript-base64.html , यह सिर्फ उपयोगकर्ता और पासवर्ड के एक बेस 64 है:

function make_base_auth(user, password) { 
    var tok = user + ':' + password; 
    var hash = Base64.encode(tok); 
    return "Basic " + hash; 
} 

और फिर आप बस फिर से करने से पहले jQuery के साथ शीर्ष लेख खोज:

var service_url = "https://example.com/myservice.asmx" 
$.ajax({ 
    type: "GET", 
    url: service_url, 
    dataType: "xml", 
    data: "ParamId=" + FormId.value, 
    processData: false, 
    beforeSend : function(req) { 
     req.setRequestHeader('Authorization', 
       make_base_auth ('USERNAME', 'PASSWORD')); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     ajaxError(XMLHttpRequest, textStatus, errorThrown); 
    }, 
    success: function(xml) { DoSomething(xml); } 
}); 
+19

यह मूल प्रमाणीकरण है। –

+4

यह मेरे लिए काम नहीं किया !! , विंडोज प्रमाणीकरण –

+0

के साथ प्रमाणित करने के लिए यदि मैं बेस 64 एन्क्रिप्ट के साथ उपयोगकर्ता आईडी और pwd एन्क्रिप्ट करता हूं तो मुझे लगता है कि मुझे डेटा को डिक्रिप्ट करने के लिए सेवा अंत में अतिरिक्त कोड लिखना होगा? क्या मैं सही हू? – Thomas

64

मैं आजकल लगता है कि आप बस, true करने के लिए अनुरोध वस्तु की withCredentials संपत्ति सेट कर सकते हैं जैसे:

$.ajax({ 
    type: "GET", 
    url: service_url, 
    dataType: "xml", 
    data: "ParamId=" + FormId.value, 
    processData: false, 
    xhrFields: { 
     withCredentials: true 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { ajaxError(XMLHttpRequest, textStatus, errorThrown); }, 
    success: function(xml) { DoSomething(xml); } 
}); 

मौजूदा कारण बनता है प्रमाणीकरण हेडर/कुकीज़ AJAX अनुरोध में पारित किया जाना है , मेरे लिये कार्य करता है। अपनी खुद की बेस एन्कोडिंग करने की आवश्यकता नहीं है, आदि

+0

यह इंटरनेट एक्सप्लोरर पर काम करता है ?? –

+0

आप यह नहीं कहते कि IE का कौन सा संस्करण है, लेकिन यह सिर्फ jquery API का उपयोग कर रहा है, इसलिए सिद्धांत में इसे IE के प्रत्येक संस्करण पर काम करना चाहिए जो jquery का समर्थन करता है। कोशिश करो और देखें! –

+0

बढ़िया, मेरे लिए पूरी तरह से काम करता है (एनटीएलएम प्रमाणीकरण) – Trapias

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

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