5

Estoy intentando implementar un proyecto de aplicación web en el que mis páginas web puedan verificar la fecha/hora del vencimiento del ticket de autenticación del servidor utilizando AJAX.Comprobar la caducidad del ticket de autenticación sin afectarlo

Estoy usando la Autenticación de formularios con slidingExpiration.

El problema que encuentro es que no puedo encontrar la forma de verificar el valor sin reiniciarlo. He creado una página sencilla - CheckExpiration.aspx - a continuación es el código subyacente:

private class AjaxResponse 
    { 
    public bool success; 
    public string message; 
    public string expirationDateTime; 
    public string secondsRemaining; 
    public string issueDate; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    AjaxResponse ar = new AjaxResponse(); 
    JavaScriptSerializer js = new JavaScriptSerializer(); 

    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 
     string expiration = id.Ticket.Expiration.ToString(); 

     TimeSpan timeRemaining = id.Ticket.Expiration - DateTime.Now; 

     ar.success = true; 
     ar.expirationDateTime = expiration; 
     ar.issueDate = id.Ticket.IssueDate.ToString(); 
     ar.secondsRemaining = timeRemaining.Minutes.ToString() + ":" + timeRemaining.Seconds.ToString(); 
    } 
    else 
    { 
     ar.success = false; 
     ar.message = "User not authenticated"; 
    } 

    string output = js.Serialize(ar); 
    Response.Write(js.Serialize(ar)); 

    } 

que llamo esta página desde la página maestra en mi solicitud usando ajax cada segundo. Pasado el punto medio de la expiración de autenticación, la expiración se restablece.

¿Cómo puedo evitar este comportamiento? ¿Hay algo que pueda hacer en el encabezado de la solicitud, tal vez?

+0

cheque esto es algo similar o su problema es dif ... http: //www.dotnetmonster.com/Uwe/Forum.aspx/asp-net-security/2316/problem-with-slidingExpiration – Scorpio

+0

Creo que esta publicación a la que está enlazando es alguien que tiene problemas con el comportamiento predeterminado de .net. No me importa ese comportamiento porque si permaneces inactivo, no sabrás que has cerrado la sesión en el servidor hasta que intentes hacer algo. Estoy tratando de hacer algo más fácil de usar, donde se le informará que está a punto de cerrar la sesión. Tampoco quiero confiar solo en un temporizador de JavaScript establecido al ingresar a una página porque la autenticación podría actualizarse desde otra pestaña. –

Respuesta

0

¿Por qué no almacena la caducidad como una variable de sesión que calcula usted mismo? Solo necesita obtener el valor de id.Ticket.Expiration una vez. Luego, cada llamada, obtenga el valor del servidor e increméntelo en consecuencia, y guárdelo en el servidor.

http://msdn.microsoft.com/en-us/library/ms178581%28v=vs.85%29.aspx

Pseudocódigo:

if(!Session.KeyExists("Expiration")) 
{ 
    Session["Expiration"] = id.Ticket.Expiration; 
} 

Session["TimeRemaining"] = Session["Expiration"] - DateTime.Now; 

// get all ajaxy here 
0

Deja tu página CheckExpiration.aspx en su propia aplicación y desplegarla como un directorio virtual debajo de su aplicación principal. En ese directorio virtual, configure slidingExpiration = false. Su código funcionará tal cual, pero no regenerará el ticket cuando se reduzca a la mitad del tiempo hasta la caducidad.

Esto es lo que hice en un proyecto local rápida para verificar que funciona:

  1. creado una nueva aplicación web AuthTest4 y configurado para usar el servidor IIS local en ruta/AuthTest4
  2. entró en IIS y cambió la configuración de la Clave del equipo para/AuthTest4 para desmarcar todas las opciones de Generación automática/Aislar y generó su propia MachineKey.
  3. creado una aplicación web ExpCheck vacío y poner su código CheckExpiration.aspx en ella
  4. aplicación web
  5. configurado ExpCheck utilizar IIS local en el directorio virtual/AuthTest4/ExpCheck
  6. modificado el web.config de la aplicación a ExpCheck tienen solo la sección que se muestra a continuación

ExpCheck web.config. Todas las demás configuraciones de seguridad caerán en cascada desde el directorio virtual principal.

<system.web> 
    <authentication mode="Forms"> 
    <forms slidingExpiration="false" /> 
    </authentication> 
</system.web> 
Cuestiones relacionadas