2008-10-13 54 views
23

我使用下面的代码设置cookie有效期:ASP.NET Cookie过期时间总是1/1/0001 12:00 AM


// 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 

当我读取cookie另一页中的超时我正在收到1/1/0001 12:00 AM。如果有人能帮我弄清楚这个问题,我会很感激。我正在使用ASP.NET 3.5

好的。在阅读了Gulzar的链接之后,看起来我根本无法检查cookie.Expires对HttpRequest的依赖?因为链接似乎暗示cookie.Expires总是设置为DateTime.MinValue,因为服务器永远不会知道客户端计算机上的实际时间?所以这意味着我必须自己将时间存储在cookie中并检查它?我的理解是否正确?

感谢 桑卡

回答

3

是否使用的是asp.net的版本?这在asp.net forum中讨论过。

+14

以后检索的到期时间请包括您的答案中链接页面的相关详细信息。 – ThiefMaster 2012-11-25 11:50:52

0

链接中讨论的版本问题没有帮助。基本上ASP.NET cookie很糟糕。我必须自己在cookie内存储过期日期时间,并在每个请求中检查它。

+5

但这并不是因为ASP.NET cookies吸吮。 HTTP响应Cookie只是没有这个信息。 – 2010-08-06 08:58:45

50

这里的问题并不在于ASP.NET,而是浏览器在http请求中提供的信息量。无论您在服务器端使用的平台如何,失效日期都是无法实现的。

正如你在自己的问题中总结的那样,由HttpRequest对象提供的HttpCookie对象的Expires属性始终设置为1/1/0001 12:00 AM。 这是因为此过期信息以及域和路径等属性在浏览器发送请求时不会传递给服务器。唯一发送的cookie信息是名称和值。因此,请求中的Cookie将具有这些'缺少'字段的默认值,因为它们在服务器端是未知的。

我想这背后的原因是,cookie的到期时间,域名和路径属性只能在浏览器使用时决定它是否应该在请求中传递cookie,或者不是,服务器只对名称和值有兴趣。

你身边的工作建议复制到期时间,因为cookie的另一个值是获得你正在寻找的行为的一种方式。

4

起初我也对Request cookie没有实际Expires值的原因感到失望。通过使用Fiddler2调试http后。我知道.NET并没有错,相反,http协议是为什么请求cookie的行为如此。

如果您在应用程序和浏览器之间使用Fiddler。您可以看到响应cookie正确发送到所有域,路径,过期,安全和httponly的浏览器。然而,在http cookie header中的下一个请求cookie没有expires值,它只有cookie名称和值。浏览器负责发送这个请求头,我相信那是因为http协议。之所以会这样,是因为为了最小化大小和Web服务器,并不需要检查它,因为它们实际上设置了所有的值。他们应该注意。

所以你不需要检查Web请求的过期值,因为你已经知道日期。只是,如果您收到返回的cookie,意味着cookie尚未过期。一旦你设置到期,浏览器将处理到期。如果您想更改过期时间,只需在响应中设置新值即可。

CallMeLaNN

0

我在使用Iphone进行测试时遇到了类似的问题。问题是由于Iphone在设备上设置了错误的日期时间,因此将cookie的过期日期设置为datetime.now.adddays(-1)没有过期cookie

0

要解决此问题,我添加了一个声明到校长,我就可以回读和显示cookie的到期时间给用户,如下所示:

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); 
    } 

那你就能够从ClaimsPrinciple通过

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