2010-08-07 9 views
14

Ho alcune chiamate AJAX che eseguono PartialViewResults tramite il metodo jQuery.AJAX. Funziona alla grande, ottengo le mie visualizzazioni rese esattamente nel modo che voglio.ASP.NET MVC impone il reindirizzamento di una richiesta AJAX alla pagina di accesso quando la sessione FormsLogin non è più attiva

Il problema sorge quando esco dalla pagina per un po 'e scade la sessione di autenticazione dei moduli. Quando faccio clic su un'azione che esegue una richiesta AJAX, mostra la pagina di accesso nel mio div.

Voglio reindirizzare la pagina WHOLE alla pagina di accesso.

risposta

23

Set in su nel metodo Application_EndRequest() del Global.asax

È possibile controllare per vedere se la richiesta è una richiesta AJAX e verificare anche se si sta inviando un reindirizzamento HTTP (302) se si tratta di , poi abbiamo actuall vogliamo inviare 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; 
      } 
     } 

poi nel codice del client, in una zona accessibile a livello globale:

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

Se si desidera per fare questo per TUTTE le richieste Ajax sulla tua pagina (utile su una singola app ajax) dai un'occhiata a http://api.jquery.com/ajaxComplete/ – MattW

+3

Questo uccide la possibilità di usare RedirectToAction() all'interno di un'azione chiamata tramite ajax. Ho implementato questo codice e ho dovuto rimuoverlo perché RedirectToAction() invia anche un 302 valido. –

+0

@JasonButera Non sono sicuro che questo sia ancora interessante per te, ma ho trovato un modo per eluderlo con le versioni più recenti di ASP.NET MVC. Per favore vedi la mia risposta. –

0

Con mai le versioni di ASP.NET MVC v'è un molto e soluzione asier per risolvere questo problema: Response.SuppressFormsAuthenticationRedirect.

È possibile applicare questo nel vostro 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

Quando ho FormsAuthentication a posto, ho includerà l'URL di accesso nella risposta https://stackoverflow.com/a/3431350/1559213 fornito da @ 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; 
     } 
    } 
Problemi correlati