2009-03-17 15 views
7

Estoy utilizando FormsAuthentication y ASP.Net SqlMembership Provider. Me gustaría proporcionar una funcionalidad para redirigir a la página de inicio de sesión cuando la sesión subyacente está vencida. Puse el siguiente bloque de códigos en mi BasePage OnInit. Por lo que he probado, siempre sigue redirigiendo a la página de inicio de sesión a pesar de que proporcioné el ID de usuario y la contraseña correctos. Por derecho, debería llevarme a la página predeterminada. Es bastante urgente y cualquier ayuda sería muy apreciada.Cómo redirigir a la página de inicio de sesión cuando la sesión ha expirado (ASP.NET 3.5 FormsAuthen)

Saludos, 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

¿No está esta funcionalidad incorporada a la autenticación de formularios de todos modos? –

+0

@Rob: Sí, lo es. –

Respuesta

19

No es necesario ningún código personalizado para esta funcionalidad, es apoyado por el marco. Sólo se debe configurar en el web.config:

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

Con la configuración anterior, el usuario será siempre redirigidos a la página Login.aspx cuando su sesión expira. Hay un tiempo de espera de 60 minutos, y la expiración variable significa que el tiempo de espera se extiende cada vez que el usuario realiza una solicitud a la aplicación web, por lo que si se mantiene activo, la sesión no caducará. Una configuración como esta le brinda otra ventaja sobre lo que intentó hacer: una vez que el usuario inicia sesión, se le redirigirá automáticamente al recurso que solicitó originalmente. Y siempre puede anular y personalizar este comportamiento.

+0

Hola Pawel Krakowiak, Agradezco su respuesta. :) De hecho, ya he hecho las mismas configuraciones que mencionaste anteriormente. :(Pero no sé qué se me ha ocurrido hacer una codificación personalizada para atender la funcionalidad ya existente. Saludos, Kyaw Thurein –

+0

Digamos que esto sucede cuando hacen clic en un botón Guardar en un formulario que sí lo hace una devolución de datos, se dirigen a la página de inicio de sesión, luego inician sesión y vuelven al recurso original. ¿Se completará la devolución de datos para que los datos del formulario se puedan procesar como de costumbre? – AaronLS

+1

@aaronls: No, los datos se perderán. la URL solicitada se recuerda. –

13

Pawel's answer es parcialmente correcto, pero también debe configurar Session de por vida a un valor más largo que la vida de la cookie de autenticación de formularios también. El valor de autenticación de formularios timeout solo afecta la duración de la cookie de autenticación. En el ejemplo que proporcionó, la duración de la cookie de autenticación es de 60 minutos, pero la duración de la sesión predeterminada es de 20 minutos. Si un usuario abandonó su máquina por más de 20 minutos, sus datos de sesión se descartarían, los intentos posteriores de referenciar un valor almacenado en la sesión producirían una excepción (por ejemplo, System.NullReferenceException si se intenta .ToString() o un lanzamiento).

Es posible ajustar esta a nivel mundial en la aplicación si configura los ajustes sessionState en su archivo web.config:

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

Adición de cinco o diez minutos para el tiempo de espera de sesión proporciona una buena amortiguación.

+0

Gracias por la explicación adicional. De hecho, es importante cuando usa variables de sesión. Solo tengo el hábito de comprobar paranoicamente su existencia/valor antes de intentar usarlos. ;) –

+1

Lo sé ... es una lástima que no tengan una configuración signoutIfSessionExpired = "true". – Kev

+0

Hola Kev, Realmente gracias por su consejo. Saludos, Thurein –

Cuestiones relacionadas