Ich weiß, dass dieses Thema alt ist, aber ich werde noch einen weiteren Ansatz nennen, den ich gefunden und zuvor beschrieben habe aquí . Im Grunde bin ich mit ASP.MVC mit WIF (aber das ist für den Kontext dieses Themas nicht wirklich wichtig - die Antwort ist angemessen, egal welcher Rahmen verwendet wird. Der Hinweis bleibt unverändert - Umgang mit Problemen im Zusammenhang mit Authentifizierungsfehlern bei der Durchführung von Ajax-Anfragen) .
Der unten gezeigte Ansatz kann auf alle Ajax-Anfragen angewendet werden (sofern sie das Ereignis beforeSend nicht neu definieren).
$.ajaxSetup({
beforeSend: checkPulse,
error: function (XMLHttpRequest, textStatus, errorThrown) {
document.open();
document.write(XMLHttpRequest.responseText);
document.close();
}
});
Bevor eine Ajax-Anfrage ausgeführt wird CheckPulse
Methode aufgerufen wird (die Controller-Methode, bei der es sich um die einfachste Methode handeln kann):
[Authorize]
public virtual void CheckPulse() {}
Wenn der Benutzer nicht authentifiziert ist (das Token ist abgelaufen), kann auf diese Methode nicht zugegriffen werden (geschützt durch Authorize
Attribut). Da das Framework die Authentifizierung handhabt, während das Token abläuft, wird der http-Status 302 in die Antwort eingefügt. Wenn Sie nicht wollen, dass Ihr Browser die 302-Antwort transparent verarbeitet, fangen Sie sie in Global.asax ab und ändern Sie den Antwortstatus - zum Beispiel in 200 OK. Fügen Sie außerdem einen Header hinzu, der Sie anweist, diese Antwort auf besondere Weise zu verarbeiten (später auf der Client-Seite):
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302
&& (new HttpContextWrapper(Context)).Request.IsAjaxRequest())
{
Context.Response.StatusCode = 200;
Context.Response.AddHeader("REQUIRES_AUTH", "1");
}
}
Schließlich wird auf der Client-Seite geprüft, ob eine solche benutzerdefinierte Kopfzeile vorhanden ist. Falls vorhanden, sollte eine vollständige Umleitung zur Anmeldeseite erfolgen (in meinem Fall window.location
wird durch die URL der Anfrage ersetzt, die von meinem Framework automatisch verarbeitet wird).
function checkPulse(XMLHttpRequest) {
var location = window.location.href;
$.ajax({
url: "/Controller/CheckPulse",
type: 'GET',
async: false,
beforeSend: null,
success:
function (result, textStatus, xhr) {
if (xhr.getResponseHeader('REQUIRES_AUTH') === '1') {
XMLHttpRequest.abort(); // terminate further ajax execution
window.location = location;
}
}
});
}
1 Stimmen
(nicht eine Antwort als solche) - Ich habe dies in der Vergangenheit durch Bearbeiten der Jquery-Bibliothek und Hinzufügen einer Prüfung für die Login-Seite auf jedem XHR abgeschlossen getan. Nicht die beste Lösung, weil es jedes Mal getan werden müsste, wenn Sie aktualisieren, aber es löst das Problem.
1 Stimmen
Siehe dazugehörige Frage: stackoverflow.com/questions/5941933/
0 Stimmen
El
HttpContext.Response.AddHeader
und prüfen Sie den Erfolg von ajaxsetup6 Stimmen
Warum kann der Server nicht 401 zurückgeben? In diesem Fall können Sie ein globales $.ajaxSetup haben und den Statuscode verwenden, um die Seite umzuleiten.
1 Stimmen
Dieser Link doanduyhai.wordpress.com/2012/04/21/ gibt mir die richtige Lösung
0 Stimmen
Schauen Sie sich bitte an diese Antwort .