2010-03-16 5 views
5

Ich möchte den Header der HTTP-Basisauthentifizierung in einem Authentifizierungscookie speichern, damit ich mich bei nachfolgenden Anforderungen nicht mit dem Autorisierungsheader befassen muss (ich verwende jQuery):Ajax: HTTP Basic Authentifizierungs- und Authentifizierungscookie

Während dies für den ersten Benutzer funktioniert, der sich anmeldet, funktioniert es für andere Benutzer innerhalb der Browsersitzung nicht, da die nachfolgenden Autorisierungsheader hinzugefügt und nicht überschrieben werden. Ich weiß, dass man einen Cookie mit der Syntax name=value überschreiben könnte, aber diese Syntax gilt nicht für den Berechtigungsheader.

Gibt es eine Möglichkeit, den alten Berechtigungsheader loszuwerden, sobald sich ein neuer Benutzer anmeldet?

Jede Hilfe wäre willkommen. Danke, JeHo

+0

Können Sie einen beliebigen Code auf der Serverseite ändern? Welche Sprache verwendest du (PHP, Python usw.)? – bpedro

+0

Die Serverseite ist ein Selfhosted (WebServiceHost) -DVF-Datenservice (in C# geschrieben). Ich bin Besitzer dieses Hosts, also könnte ich Änderungen daran vornehmen - aber ich fürchte, die Möglichkeiten sind begrenzt. – Jeldrik

Antwort

11

Es scheint, dass es nicht auch für den ersten Benutzer funktionierte. Das Problem war, dass der Berechtigungs-Header wahrscheinlich früher vom Browser gesetzt wurde (als ich den Authentifizierungs-Dialog des Browsers benutzt habe).

Was ich jetzt mache, speichert die Login-Informationen in einem Standard-Name = Wert-Cookie und die Autorisierung Header manuell einstellen.

das Cookie Set:

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

das Cookie lesen:

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

Stellen Sie den Autorisierungsheader:

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

Dies scheint ein wenig umständlich, aber es funktioniert.