2010-08-07 4 views
14

J'ai certains appels AJAX qui restituent PartialViewResults via la méthode jQuery.AJAX. Cela fonctionne très bien, je reçois mes opinions exactement comme je le veux.ASP.NET MVC force une requête AJAX être redirigée vers la page de connexion lorsque la session FormsLogin n'est plus active

Le problème survient lorsque je quitte la page pendant un certain temps et que la session d'authentification Forms expire. Lorsque je clique sur une action qui effectue une requête AJAX, elle affiche la page de connexion dans mon div.

Je veux qu'il redirige la page WHOLE à la page de connexion.

Répondre

23

dressa dans la méthode Application_EndRequest() du Global.asax

Vous pouvez vérifier si la demande est une demande de paiement ajax et vérifiez également si elle envoie une redirection HTTP (302) si elle est , nous Actuall voulons envoyer 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; 
      } 
     } 

puis dans votre code client, dans une zone globalement accessible:

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 vous voulez pour faire cela pour TOUTES les requêtes ajax sur votre page (utile sur une seule page ajax app) jetez un oeil à http://api.jquery.com/ajaxComplete/ – MattW

+3

Cela tue la possibilité d'utiliser RedirectToAction() dans une action appelée via ajax. J'ai eu ce code implémenté et nécessaire pour le supprimer car RedirectToAction() envoie également un 302 valide. –

+0

@JasonButera Je ne sais pas si cela vous intéresse toujours, mais j'ai trouvé un moyen de le contourner avec les nouvelles versions d'ASP.NET MVC. S'il vous plaît voir ma réponse. –

0

Avec jamais les versions d'ASP.NET MVC il y a beaucoup e Une solution plus efficace pour résoudre ce problème: Response.SuppressFormsAuthenticationRedirect.

Vous pouvez appliquer dans votre 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

Quand j'ai FormsAuthentication en place, je vais inclure l'URL de connexion dans la réponse fournie par https://stackoverflow.com/a/3431350/1559213 Kooken @ Chris

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; 
     } 
    } 
Questions connexes