2010-07-13 8 views
1

Je récupère une vue partielle via $ .ajax() et dans le cas où vous définissez le mode inactif pendant 30 minutes et essayez d'extraire cette vue partielle, l'authentification des formulaires a expiré et au lieu d'obtenir ma vue partielle est retournée à moi, je vais obtenir la page de connexion dans mon.PartialView Render Forms timeout

Des suggestions sur la façon de gérer une telle situation?

Merci.

$(function() { 
    $("#addContact").click(function() { 
     $.get('/Contacts/Add', function (data) { 
      $("#content").html(data); <--gets login page as data 
     }); 
    }); 
}); 

Répondre

2

Est-ce que votre Action Add a des consommateurs non-Ajax? Si ce n'est pas le cas, je suggérerais de supprimer l'attribut [Authorize] de l'action, ce qui supprimerait le problème de timeout-redirect. (Si votre contrôleur entier est décoré avec [Authorize], vous devez supprimer l'attribut de niveau contrôleur et orner toutes vos autres actions. Pour plus de sécurité, vous pouvez faire quelque chose comme ceci pour empêcher les appels non-Ajax d'appeler votre action Add.

public ActionResult Add() 
    { 
     if (Request.IsAjaxRequest()) 
      return View("Error"); 

     return View(); 
    } 

Si, d'autre part, votre Add l'action doit soutenir Ajax et appels normaux, d'une façon que vous pouvez résoudre ce problème est de créer une nouvelle classe d'attributs qui hérite de et remplace AuthorizeAttribute. Consultez la source d'orientation: http://aspnet.codeplex.com/SourceControl/changeset/view/23011#266447

Vous devriez être en mesure de faire l'affaire en redéfinissant la méthode AuthorizeCore, comme si

public class AjaxAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
    { 
     if (httpContext.Request.IsAjaxRequest()) 
      return true; 

     return base.AuthorizeCore(httpContext); 
    } 
} 

vous pouvez utiliser [AjaxAuthorize] sur votre contrôleur et/ou une action.

Pour être clair, ce que vous faites ici est de donner à l'utilisateur une extension de son délai d'attente s'il lance un appel via Ajax. Une fois qu'ils ont actualisé la page ou quitté le site, ils sont invités à se reconnecter, comme d'habitude.

Espérons que ça aide. Faites-moi savoir si vous rencontrez des problèmes.

-1

Cela dépend un peu si vous êtes d'accord pour changer la durée pendant laquelle les utilisateurs seront connectés. Si vous êtes, vous pouvez modifier votre fichier de configuration à quelque chose comme ce qui suit ...

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="512640" /> 
</authentication> 

Cela permet de garder les utilisateurs connectés pendant un an. Si la modification de la durée de connexion des utilisateurs n'est pas une option, vous devez gérer la réponse ajax et rediriger les utilisateurs vers un formulaire de connexion.

+0

Je ne suis pas autorisé à le faire. Notre politique de sécurité stipule 30 minutes ou moins pour les délais d'attente. –

0

Avant de faire l'appel Ajax, pouvez-vous en faire un autre à un contrôleur non autorisé pour s'assurer que l'utilisateur est authentifié? Si c'est le cas, continuez comme d'habitude, sinon vous pouvez simplement montrer une lightbox de connexion afin de ne pas quitter la page et maintenir l'expérience de l'utilisateur.

0

Une autre solution serait d'ajouter un script à votre page de connexion pour vérifier si elle est rendue dans une fenêtre pop-up. Si c'est le cas, vous pouvez utiliser location.href() pour rediriger la page entière vers la page de connexion.