2009-06-16 28 views
29

Tôi đang sử dụng jQuery để gọi một dịch vụ web Net như thế này:Tôi làm cách nào để chuyển xác thực cửa sổ cho dịch vụ web bằng jQuery?

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); } 
}); 

Bây giờ tôi muốn quấn "https://example.com/myservice.asmx" trong Windows Authentication. Làm cách nào tôi có thể chuyển thông tin đăng nhập vào dịch vụ bằng jQuery/javascript?

Lý tưởng nhất là tôi muốn sử dụng bằng chứng xác thực của người dùng hiện tại nhưng nếu cần tôi có thể sử dụng 1 thông tin xác thực chính cho tất cả các cuộc gọi dịch vụ.

Trả lời

13

Dường như bạn cần đặt tiêu đề yêu cầu bằng dữ liệu auth base64 theo cách thủ công.

Các hướng dẫn đang ở đây: http://coderseye.com/2007/how-to-do-http-basic-auth-in-ajax.html

Trước tiên bạn cần để có những đoạn mã sau từ đây: http://www.webtoolkit.info/javascript-base64.html để làm mã hóa base64

/** 
* 
* 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; 
    } 

} 

Sau đó, bạn sẽ cần mã để xây dựng dữ liệu auth , nó chỉ là một base64 của người dùng và mật khẩu:

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

Và sau đó bạn chỉ cần thêm tiêu đề với jQuery trước khi thực hiện lại quest:

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

đây là xác thực cơ bản. –

+4

điều này không hiệu quả đối với tôi !! , để xác thực với cửa sổ xác thực –

+0

nếu tôi mã hóa userid & pwd với mã hóa base64 sau đó tôi đoán tôi cần phải viết mã extrac ở cuối dịch vụ để giải mã dữ liệu? Tôi có đúng không? – Thomas

64

Tôi nghĩ rằng ngày nay bạn chỉ có thể thiết lập các withCredentials tài sản của đối tượng yêu cầu để true, ví dụ:

$.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); } 
}); 

gây hiện tiêu đề xác thực/cookie để được thông qua cùng trong yêu cầu AJAX , làm việc cho tôi. Không cần phải làm Mã hóa cơ sở của riêng bạn, v.v.

+0

hoạt động trên internet explorer ?? –

+0

Bạn không nói phiên bản nào của IE, nhưng đây chỉ là sử dụng API jquery, vì vậy về mặt lý thuyết nó nên hoạt động trên mọi phiên bản IE mà jquery hỗ trợ. Hãy thử nó và xem! –

+0

tuyệt vời, hoạt động hoàn hảo cho tôi (xác thực NTLM) – Trapias

Các vấn đề liên quan