2010-08-07 11 views
14

Tengo algunas llamadas AJAX que procesan PartialViewResults a través del método jQuery.AJAX. Esto funciona muy bien, obtengo mis puntos de vista representados exactamente de la manera que quiero.ASP.NET MVC obliga a una solicitud AJAX a ser redireccionada a la página de inicio de sesión cuando la sesión de FormsLogin ya no está activa

El problema surge cuando dejo la página activa durante un tiempo y la sesión de autenticación de formularios expira. Cuando hago clic en una acción que realiza una solicitud de AJAX, muestra la página de inicio de sesión en mi div.

Quiero que redirija la página ENTERO a la página de inicio de sesión.

Respuesta

23

configurarlo en el método Application_EndRequest() de la Global.asax

Usted puede comprobar para ver si la petición es una petición Ajax y también comprobar si está enviando una redirección HTTP (302) si se trata de , entonces Actuall queremos enviar un 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; 
      } 
     } 

luego, en su código de cliente, en una zona accesible a nivel mundial:

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

Si desea para hacer esto para TODAS las solicitudes ajax en su página (útil en una aplicación ajax de una sola página) eche un vistazo a http://api.jquery.com/ajaxComplete/ – MattW

+3

Esto elimina la capacidad de usar RedirectToAction() dentro de una acción llamada a través de ajax Tenía este código implementado y necesitaba eliminarlo porque RedirectToAction() también envía un 302 válido. –

+0

@JasonButera No estoy seguro de si esto todavía es interesante para usted, pero he encontrado una manera de eludirlo con las versiones más recientes de ASP.NET MVC. Por favor mira mi respuesta. –

0

con nUNCA versiones de ASP.NET MVC hay un gran correo solución asier para solucionar este problema: Response.SuppressFormsAuthenticationRedirect.

Se puede aplicar esto en su Global.asax.cs:

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

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

Cuando tengo FormsAuthentication en su lugar, voy a incluir la URL de sesión en la respuesta proporcionada por https://stackoverflow.com/a/3431350/1559213 @ 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; 
     } 
    } 
Cuestiones relacionadas