2010-12-09 29 views
8

He visto varios artículos como this one que explican cómo detectar que se ha agotado el tiempo de espera de la sesión de un usuario. Y por el bien de la claridad, estos artículos se refieren al valor de tiempo de espera definido por esta línea web.config:ASP.NET: cómo detectar el tiempo de espera de autenticación

<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" /> 

no entrar en ese método demasiado, pero esto requiere la comprobación de que Session.IsNewSession es verdadera y que una la cookie de sesión ya existe Pero no he visto ningún artículo sobre cómo detectar autenticación tiempo de espera - el definido por esta línea web.config:

<authentication mode="Forms"> 
    <forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/> 
</authentication> 

múltiples artículos en línea, incluyendo this SO post, han dicho que el valor de tiempo de espera de sesión debe generalmente duplica el valor de tiempo de espera de autenticación. Entonces, como ahora, mi sesión es 120 y mi Autenticación es 60. Esto significa que nunca me encontraré en una situación en la que la sesión ha expirado, pero el usuario aún está autenticado; si el usuario excede el tiempo de espera, se deberá a Autenticación, no a Sesión.

Entonces, como todos los demás, estoy interesado en cómo informar al usuario que se ha agotado el tiempo de espera de la sesión (pero en realidad se debe al tiempo de espera de la autenticación). ¿Alguien sabe de una manera de lograr esto, o cualquier recurso en línea que pueda indicarme una solución?

+0

Lo siento, estoy un poco confundido. ¿Su problema es cómo detectar el tiempo de espera o cómo informarle al usuario que ha detectado un tiempo de espera excedido? – Ender

+1

Informar al usuario debe ser sencillo una vez que sepa cómo detectar el tiempo de espera. Estoy mucho más interesado en cómo detectar el tiempo de espera que en cómo informarlo. –

+0

También he tenido problemas con esto, ya que es imposible distinguir entre una falla de autenticación o una falla de autorización cuando el usuario es redirigido a la página de inicio de sesión. - http://stackoverflow.com/questions/1352501/detecting-forms-authentication-timeout-in-login-page – RyanW

Respuesta

1

Probablemente este no sea el enfoque óptimo, pero esto es algo en lo que pensé.

Al iniciar sesión, registre una marca de tiempo en el marcado de la sesión cuando el usuario inició sesión. En cada solicitud posterior (tal vez en el archivo global.asax BeginRequest?), Compare esta marca de tiempo con la hora actual y compárela con la autenticación tiempo de espera (Scott Hanselman explains how to read it here).

Esa es mi "parte superior fuera de mi cabeza" pensado de todos modos ...

1

que permitiría la obtención de la tubería http primera hora de la solicitud y enviar una respuesta apporpriate.
Mi fuente para responder a estas preguntas es:

módulo

Professional ASP.NET 2.0 Security, Membership, and Role Management

Un HTTP puede hacer el truco:

Web.config:

<configuration> 
    <system.web> 
    <httpModules> 
     <add name="MyAuthModule" type="MyAssembly.Security.MyAuthModule, MyAssembly"/> 

...

El Modu HTTP real le:

/// <summary> 
/// A module for detecting invalid authentication 
/// </summary> 
/// <remarks>See "How To Implement IPrincipal" in MSDN</remarks> 
public class MyAuthModule : IHttpModule 
{ 
    #region IHttpModule Members 
    void IHttpModule.Dispose() { } 
    void IHttpModule.Init(HttpApplication context) 
    { 
     context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest); 
    } 
    #endregion 


    /// <summary> 
    /// Inspect the auth request... 
    /// </summary> 
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks> 
    private void context_AuthenticateRequest(object sender, EventArgs e) 
    { 
     HttpApplication a = (HttpApplication)sender; 
     HttpContext context = a.Context; 

     // Extract the forms authentication cookie 
     string cookieName = FormsAuthentication.FormsCookieName; 
     HttpCookie authCookie = context.Request.Cookies[cookieName]; 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      // check if previously authenticated session is now dead 
      if (authTicket != null && authTicket.expired) 
      { 
       // send them a Response indicating that they've expired. 
      } 
     } 
    } 
} 

¡Buena suerte!

+0

Esto parece muy prometedor, y lo probé. Pero parece que, cuando mi período de autenticación ha expirado, la "authCookie" es nula en el código que ha proporcionado. Lo que me hace preguntarme cómo la propiedad "Expirado" alguna vez sería cierta. ¿Hay alguna manera de que authCookie no sea nulo y aún expire? Gracias. –

+0

@ mega-matt: muy probable que sea cierto. Pero, ¿es importante para su propósito? La ausencia de la cookie de autenticación al principio de la canalización también identificaría una "sesión" de autorización vencida: el navegador no devolverá las cookies caducadas. Estaba usando el código para otro propósito, pero he descubierto que aprovechar el HTTP Pipleline es una técnica muy poderosa ... – Brett

+0

Tiene razón, la ausencia de la cookie de autenticación típicamente significa que el período de autenticación ha expirado. Pero, ¿qué pasa antes de que se cree la cookie? El código que proporcionó se ejecutará antes de que se establezca la cookie. Entonces, cuando el usuario inicie sesión (no se creó la cookie de autenticación), este código se ejecutará y continuará redirigiéndolos a la página de inicio de sesión (que es lo que había planeado hacer en la situación de autenticación caducada). Entonces, sí, la ausencia de la cookie de autenticación * podría * significar que la sesión de autenticación ha expirado, pero también podría significar que la cookie aún no se ha creado. ¿Pensamientos? –

1

Al iniciar sesión con el usuario, puede colocar una cookie en la máquina del usuario para indicar que tuvo una sesión. Cuando el usuario llega a la página de inicio de sesión (porque si su sesión expiró, su inicio de sesión también debe tenerla), verifique si el usuario tiene esa cookie y si tiene alguna de las claves de sesión que espera que tenga (si esto resulta difícil, simplemente configure una variable de sesión cuando inicien sesión). si tienen la cookie, pero ninguna de las claves de sesión, entonces su sesión expiró.

+0

También he usado este enfoque en el pasado. – RyanW

Cuestiones relacionadas