Ajax:HTTP基本身份验证和身份验证Cookie

问题描述:

我想将HTTP基本身份验证标题存储在身份验证Cookie中,这样我就不必在随后的请求中处理授权头(我正在使用jQuery):Ajax:HTTP基本身份验证和身份验证Cookie

authenticate: function(auth) { 
    var header = "Basic " + $.base64.encode(auth.username + ":" + auth.password); 
    document.cookie = "Authorization: " + header; 
    $.ajax({ 
     type: "GET", 
     url: "http://someurl", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: auth.success, 
     error: auth.error 
    }); 
}, 

虽然这似乎对于谁登录的第一个用户的工作,它不会对浏览器会话中的任何其他用户的工作,因为后续授权头被加入,而不是覆盖。我知道可以使用name=value语法覆盖cookie,但该语法不适用于授权标头。

有没有什么办法摆脱旧的授权头一旦新用户登录?

任何帮助,将不胜感激。谢谢,JeHo

+0

你可以更改服务器端的任何代码吗?你使用什么语言(PHP,Python等)? – bpedro 2010-03-16 15:17:36

+0

服务器端是一个selfhosted(WebServiceHost)wcf数据服务(用C#编写)。我是这个东道主的老板,所以我可以改变它 - 但我担心可能性是有限的。 – Jeldrik 2010-03-16 15:51:08

看来,它不适用于第一个用户。问题是,授权标题可能是早期浏览器设置的(当我使用浏览器的验证对话框时)。

我现在正在做的是将登录信息存储在标准名称=值cookie中并手动设置授权标头。

将Cookie:

var header = "Basic " + $.base64.encode(auth.username + ":" + auth.password); 
document.cookie = "Authorization=" + header; 

读取cookie:

function getAuthCookie() { 
    var cn = "Authorization="; 
    var idx = document.cookie.indexOf(cn) 

    if (idx != -1) { 
     var end = document.cookie.indexOf(";", idx + 1); 
     if (end == -1) end = document.cookie.length; 
     return unescape(document.cookie.substring(idx + cn.length, end)); 
    } else { 
     return ""; 
    } 
} 

集合授权头:

$.ajax({ 
     type: "GET", 
     url: "http://someurl", 
     contentType: "application/json; charset=utf-8", 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Authorization", getAuthCookie()); 
     }, 
     dataType: "json", 
     success: auth.success, 
     error: auth.error 
    }); 

这似乎有点尴尬,但它的作品。