2008-10-13 18 views
23

Soy la creación de la caducidad de la cookie usando el siguiente código:ASP.NET tiempo de caducidad de la cookie es siempre 1/1/0001 12:00a.m.


// remove existing cookies. 
request.Cookies.Clear(); 
response.Cookies.Clear(); 

// ... serialize and encrypt my data ... 

// now set the cookie. 
HttpCookie cookie = new HttpCookie(AuthCookieName, encrypted); 
cookie.Expires = DateTime.Now.Add(TimeSpan.FromHours(CookieTimeOutHours)); 
cookie.HttpOnly = true; 
response.Cookies.Add(cookie); 

// redirect to different page 

Cuando leí la cookie tiempo de espera en la otra página me sale 1/1/0001 12:00 a.m. Si alguien puede ayudarme a resolver el problema, lo agradeceré. Estoy usando ASP.NET 3.5

ok. Después de leer los enlaces de Gulzar, parece que no puedo verificar la cookie. ¿Se puede extraer de HttpRequest? Debido a que los enlaces parecen sugerir que Cookie.Expires siempre se establece en DateTime.MinValue porque el servidor nunca puede saber la hora real en la máquina del cliente. Entonces, ¿esto significa que tengo que almacenar el tiempo dentro de la cookie y verificarlo? Es mi entendimiento correcto?

gracias Shankar

Respuesta

3

¿Qué versión de asp.net está usando? Esto fue discutido en asp.net forum.

+14

por favor, incluya los detalles relevantes de la página vinculada en su respuesta. – ThiefMaster

0

El problema de versión discutido en el enlace no fue útil. Básicamente, la cookie ASP.NET apesta. Tuve que guardar el tiempo de la fecha de vencimiento dentro de la cookie y verificarlo en cada solicitud.

+5

Pero eso no se debe a que las cookies ASP.NET apestan. Las cookies de respuesta Http simplemente no tienen esta información. –

50

El problema aquí no está realmente en ASP.NET sino en la cantidad de información que se proporciona en la solicitud http de los navegadores. La fecha de caducidad no se puede obtener independientemente de la plataforma que esté utilizando en el lado del servidor.

Como ha resumido en su pregunta, la propiedad Expires del objeto HttpCookie que proporciona el objeto HttpRequest siempre se establece en 1/1/0001 12:00 AM. Esto se debe a que esta información de caducidad, así como las propiedades como el dominio y la ruta, no son pasadas por el navegador al servidor cuando envía una solicitud. La única información de cookie que se envía es el nombre y los valores. Por lo tanto, las cookies en la solicitud tendrán valores predeterminados para estos campos "faltantes" ya que son desconocidos en el lado del servidor.

Supongo que la razón detrás de esto es que los atributos de expiración, dominio y ruta de una cookie solo están destinados a ser utilizados por el navegador cuando está tomando una decisión sobre si debe pasar una cookie en una solicitud o no y que el servidor solo está interesado en el nombre y valor (es).

El trabajo que le rodea ha sugerido duplicar el tiempo de caducidad, ya que otro valor de la cookie es una forma de obtener el comportamiento que está buscando.

4

Al principio, también decepcioné por qué la cookie de solicitud no tiene el valor de Caducidad real. Después de depurar el http mediante el uso de Fiddler2. Sé que .NET no estaba equivocado, en cambio, el protocolo http es la respuesta por la cual las cookies de solicitud se comportan así.

Si usa Fiddler entre su aplicación y el navegador. Puede ver la cookie de respuesta enviada correctamente al navegador con todos los dominios, ruta, caduca, seguro y httponly. Sin embargo, la próxima cookie de solicitud en el encabezado de la cookie http no tiene el valor de caducidad, solo el nombre y el valor de la cookie. El navegador responsable de enviar este encabezado de solicitud y creo que es porque el protocolo http. La razón es porque para minimizar el tamaño y el servidor web no es necesario verificarlo ya que en realidad configuran todos los valores. Deberían notarlo.

Así que no es necesario que compruebe el valor de caducidad de la solicitud web, ya que ya conoce la fecha. Simplemente, si recibe la cookie nuevamente, significa que la cookie aún no ha expirado.Una vez que configure el vencimiento, el navegador manejará la caducidad. Si desea cambiar el vencimiento, simplemente configure el nuevo valor en la respuesta.

CallMeLaNN

0

que tenía un problema similar al probar con un Iphone. El problema se debió a que el Iphone tenía una fecha de hora incorrecta configurada en el dispositivo, por lo que se estableció la fecha de caducidad de la cookie en datetime.now.adddays (-1) no caducó la cookie

0

Para solucionar este problema, agregué un reclamo al director que entonces lo que puede leer y mostrar la cookie tiempo de caducidad para el usuario de la siguiente manera:

public static void Configuration(IAppBuilder app) 
    { 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString(string.Format("~/Login.aspx"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SetExpiryClaim 
      } 
     }); 

     app.MapSignalR(); 
    } 


    private static Task SetExpiryClaim(CookieValidateIdentityContext context) 
    { 
     var contextExpireUtc = context.Properties.ExpiresUtc; 

     var claimTypeName = "contextExpireUtc"; 
     var identity = context.Identity; 

     Claim contextExpiryClaim; 

     if (identity.HasClaim(c => c.Type == claimTypeName)) 
     { 
      contextExpiryClaim = identity.FindFirst(claimTypeName); 
      identity.RemoveClaim(contextExpiryClaim); 
     } 
     contextExpiryClaim = new Claim(claimTypeName, contextExpireUtc.ToString()); 
     context.Identity.AddClaim(contextExpiryClaim); 

     return Task.FromResult(true); 
    } 

entonces usted es capaz de recuperar el tiempo de caducidad después de la ClaimsPrinciple por

ClaimsPrincipal principle = Thread.CurrentPrincipal as ClaimsPrincipal; 
    DateTime contextExpiry = principle.Claims.First(p => p.Type == "contextExpireUtc").Value.AsDateTime(); 
Cuestiones relacionadas