2009-03-17 11 views
7

J'utilise FormsAuthentication et ASP.Net SqlMembership Provider. Je voudrais fournir une fonctionnalité pour rediriger vers la page de connexion lorsque la session sous-jacente a expiré. Je mets le bloc de codes suivant dans mon BasePage OnInit. Pour autant que j'ai testé, il continue toujours à rediriger vers la page LogIn même si j'ai fourni le bon UserID et mot de passe. Par les droits, il devrait me prendre à la page par défaut. C'est très urgent et toute aide serait grandement appréciée.Comment rediriger vers la page de connexion lorsque la session a expiré (ASP.NET 3.5 FormsAuthen)

Cordialement, Thurein

if (Context.Session != null && Session.IsNewSession && this.Request.IsAuthenticated) 
     { 
      string cookieHeader = Request.Headers["Cookie"]; 
      if (cookieHeader != null && cookieHeader.IndexOf("ASP.NET_SessionId") >= 0) 
      { 


        HttpContext.Current.Session.Abandon();      
        FormsAuthentication.SignOut();       
        Response.Redirect(FormsAuthentication.LoginUrl);           

      } 
     } 
+0

Cette fonctionnalité n'est-elle pas intégrée à l'authentification par formulaires? –

+0

@Rob: Oui, c'est le cas. –

Répondre

19

Vous n'avez pas besoin de code personnalisé pour cette fonctionnalité, il est pris en charge par le cadre. Il suffit de le configurer dans le web.config:

<authentication mode="Forms"> 
    <forms defaultUrl="~/Default.aspx" 
     loginUrl="~/Login.aspx" 
     slidingExpiration="true" 
     timeout="60" /> 
</authentication> 

Avec la configuration ci-dessus, l'utilisateur sera toujours redirigé vers la page Login.aspx lorsque leur session expire. Il y a un timeout de 60 minutes, et l'expiration glissante signifie que le timeout est prolongé chaque fois que l'utilisateur fait une demande à l'application web, donc s'il reste actif la session n'expirera pas. Une configuration comme celle-ci vous donne un autre avantage sur ce que vous avez essayé de faire - une fois que l'utilisateur se connecte, il sera automatiquement redirigé vers la ressource qu'il a initialement demandée. Et vous pouvez toujours remplacer et personnaliser ce comportement.

+0

Salut Pawel Krakowiak, Je vous apprécie pour votre réponse. :) En fait, j'ai déjà fait les mêmes configurations que vous avez mentionnées ci-dessus. :(Mais je ne sais pas ce qui me vient à l'esprit de faire du codage personnalisé pour répondre à la fonctionnalité déjà existante Cordialement, Kyaw Thurein –

+0

Disons que cela se produit quand ils cliquent sur un bouton Enregistrer sur un formulaire qui fait une publication, ils sont dirigés vers la page de connexion, puis se connectent et retournent à la ressource d'origine.La publication sera-t-elle terminée pour que les données du formulaire puissent être traitées comme d'habitude? – AaronLS

+1

@aaronls: Non, les données seront perdues. L'URL demandée est mémorisée –

13

Pawel's answer est partiellement correct, mais vous devez également définir la durée de vie Session sur une valeur plus longue que la durée de vie du cookie d'authentification des formulaires. La valeur d'authentification des formulaires timeout affecte uniquement la durée de vie du cookie d'authentification. Dans l'exemple qu'il a fourni, la durée de vie du cookie d'authentification est de 60 minutes, mais la durée de vie de la session par défaut est de 20 minutes. Si un utilisateur laissait sa machine pendant plus de 20 minutes, ses données de session seraient supprimées, les tentatives suivantes pour référencer une valeur stockée dans une session entraîneraient une exception (par exemple System.NullReferenceException si vous essayez de .ToString() ou une distribution).

Vous pouvez définir globalement pour votre application en configurant les paramètres sessionState dans votre fichier web.config:

<sessionState 
    mode="InProc" 
    cookieless="false" 
    timeout="70"/> 

Ajout au délai d'attente de la session de cinq ou dix minutes fournit un bon tampon.

+0

Merci pour l'explication supplémentaire. C'est en effet important lorsque vous utilisez des variables de session. J'ai juste l'habitude de vérifier paranoïde leur existence/valeur avant d'essayer de les utiliser. ;) –

+1

Je sais ... c'est dommage qu'ils n'aient pas un paramètre signoutIfSessionExpired = "true". – Kev

+0

Salut Kev, Je vous remercie vraiment pour vos conseils. Cordialement, Thurein –

Questions connexes