web-dev-qa-db-fra.com

Délai d'expiration de l'authentification par formulaire vs Délai d'expiration de session

Dans mon site asp.net j'utilise l'authentification par formulaire asp.net avec la configuration suivante

<authentication mode="Forms">
    <forms loginUrl="~/Pages/Common/Login.aspx"
           defaultUrl="~/Pages/index.aspx"
           protection="All"
           timeout="30"
           name="MyAuthCookie"
           path="/"
           requireSSL="false"
           cookieless="UseDeviceProfile"
           enableCrossAppRedirects="false" >
    </forms>
</authentication>

J'ai les questions suivantes

  1. Quelle devrait être la valeur du délai d'attente pour la session, car j'utilise l'expiration glissante à l'intérieur de l'authention du formulaire, car la session expirera avant l'authentification du formulaire. Comment puis-je le protéger?

  2. Après la déconnexion de l'authentification par formulaire, je voudrais rediriger la page sur logout.aspx mais il me redirige automatiquement sur loginpage.aspx. Comment est-ce possible?

59
Hemant Kothiyal
  1. Pour être du bon côté: TimeOut (Session) <= TimeOut (FormsAuthentication) * 2
  2. Si vous souhaitez afficher une page autre que celle spécifiée dans l'attribut loginUrl après l'expiration du délai d'authentification, vous devez gérer cela manuellement car ASP.NET ne fournit pas un moyen de le faire.

Pour atteindre # 2, vous pouvez vérifier manuellement l'expiration du cookie et son AuthenticationTicket et rediriger vers votre page personnalisée s'ils ont expiré.
Vous pouvez le faire dans l'un des événements: AcquireRequestState , AuthenticateRequest .

Un exemple de code dans l'événement peut ressembler à:

// Retrieve AuthenticationCookie
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie == null) return;
FormsAuthenticationTicket ticket = null;
try {
    ticket = FormsAuthentication.Decrypt(cookie.Value);
} catch (Exception decryptError) {
    // Handle properly
}
if (ticket == null) return; // Not authorised
if (ticket.Expiration > DateTime.Now) {
    Response.Redirect("SessionExpiredPage.aspx"); // Or do other stuff here
}
50
Dmytrii Nagirniak

Pour les sites qui ont une dépendance de session, vous pouvez simplement vous déconnecter d'une authentification périmée avec l'événement de démarrage de session dans le global.asax:

void Session_Start(object sender, EventArgs e)
{
  if (HttpContext.Current.Request.IsAuthenticated)
  {

    //old authentication, kill it
    FormsAuthentication.SignOut();
    //or use Response.Redirect to go to a different page
    FormsAuthentication.RedirectToLoginPage("Session=Expired");
    HttpContext.Current.Response.End();
  }

}

Cela fait en sorte que nouvelle session = nouvelle authentification, point.

24
b_levitt