2010-08-07 8 views
14

Ich habe einige AJAX-Aufrufe, die PartialViewResults über die jQuery.AJAX-Methode rendern. Das funktioniert super, ich bekomme meine Ansichten genau so, wie ich es möchte.ASP.NET MVC erzwingt, dass eine AJAX-Anforderung zur Anmeldeseite umgeleitet wird, wenn die FormsLogin-Sitzung nicht mehr aktiv ist

Das Problem tritt auf, wenn ich die Seite für eine Weile verlassen und die Forms Auth-Sitzung abläuft. Wenn ich auf eine Aktion klicke, die eine AJAX-Anfrage ausführt, wird die Anmeldeseite in meinem div angezeigt.

Ich möchte es die WHOLE-Seite auf die Anmeldeseite umleiten.

Antwort

23

es Set im Application_EndRequest() -Methode der

Global.asax up

Sie können überprüfen, um zu sehen, ob die Anforderung eine Ajax-Anforderung ist und auch prüfen, ob es einen HTTP-Redirect (302) sendet, wenn es , dann actuall wollen wir ein 401.

protected void Application_EndRequest() { 
      var context = new HttpContextWrapper(Context); 
      // If we're an ajax request, and doing a 302, then we actually need to do a 401 
      if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) { 
       Context.Response.Clear(); 
       Context.Response.StatusCode = 401; 
      } 
     } 

dann in Ihrem Client-Code, in einem global zugänglichen Bereich senden:

MyNamespace.handleAjaxError = function (XMLHttpRequest, textStatus, errorThrown) { 
    if (XMLHttpRequest.status == 401) { 
     // perform a redirect to the login page since we're no longer authorized 
     window.location.replace("logout path"); 
    }  
    } else { 
     MyNamespace.displayGeneralError(); 
    } 
}; 

    $.ajax({ 
    type: "GET", 
    url: userAdmin.addUserActionUrl, 
    success: userAdmin.createUserEditorDialog, 
    error: MyNamespace.handleAjaxError 
}); 
+4

Wenn Sie möchten, Um dies für ALLE ajax-Anfragen auf Ihrer Seite zu tun (nützlich in einer einzelnen Seite ajax app), werfen Sie einen Blick auf http://api.jquery.com/ajaxComplete/ – MattW

+3

Dies tötet die Fähigkeit, RedirectToAction() innerhalb einer Aktion namens via zu verwenden Ajax. Ich hatte diesen Code implementiert und musste ihn entfernen, da RedirectToAction() auch einen gültigen 302 sendet. –

+0

@JasonButera Nicht sicher, ob dies für Sie immer noch interessant ist, aber ich habe einen Weg gefunden, um es mit neueren Versionen von ASP.NET MVC zu umgehen. Bitte sehen Sie meine Antwort. –

0

Mit nie Versionen von ASP.NET MVC gibt es eine viel e asier Lösung, um dieses Problem zu beheben: Response.SuppressFormsAuthenticationRedirect.

Sie können dies in Ihrem Global.asax.cs gelten:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpContextWrapper context = new HttpContextWrapper(this.Context); 

    if (context.Request.IsAjaxRequest()) 
    { 
     context.Response.SuppressFormsAuthenticationRedirect = true; 
    } 
} 
0

Als ich FormsAuthentication an der richtigen Stelle, werde ich die Anmelde-URL in der Antwort enthalten https://stackoverflow.com/a/3431350/1559213 provided by @ Chris Kooken

protected void Application_EndRequest() 
    { 

     var context = new HttpContextWrapper(Context); 
     // If we're an ajax request, and doing a 302, then we actually need to do a 401 
     if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest() && 
      Context.Response.RedirectLocation.Contains(FormsAuthentication.LoginUrl)) 
     { 
      Context.Response.Clear(); 
      Context.Response.StatusCode = 401; 
     } 
    } 
Verwandte Themen