2008-10-13 25 views
23

Tôi đang thiết khi hết hạn cookie bằng cách sử dụng đoạn mã sau:ASP.NET thời gian hết hạn của cookie luôn là 1/1/0001 12:00


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

Khi tôi đọc cookie thời gian chờ ở trang khác tôi nhận được 1/1/0001 12:00 SA. Nếu ai đó có thể giúp tôi tìm ra vấn đề, tôi sẽ đánh giá cao nó. Tôi đang sử dụng ASP.NET 3.5

ok. sau khi đọc các liên kết từ Gulzar, có vẻ như tôi không thể kiểm tra cookie.Xuất hiện trên HttpRequest? Bởi vì các liên kết dường như gợi ý rằng cookie.Expires luôn được đặt thành DateTime.MinValue vì máy chủ có thể không bao giờ biết thời gian thực trên máy khách? Vì vậy, điều này có nghĩa là tôi phải lưu trữ thời gian bên trong cookie và kiểm tra nó? Tôi hiểu có đúng không?

nhờ Shankar

Trả lời

3

Phiên bản nào của asp.net bạn đang sử dụng? Điều này đã được thảo luận trong asp.net forum.

+14

Vui lòng gửi kèm các chi tiết liên quan từ trang được liên kết trong câu trả lời của bạn. – ThiefMaster

0

Sự cố phiên bản được thảo luận trong liên kết không hữu ích. Về cơ bản ASP.NET cookie sucks. Tôi phải lưu trữ thời gian hết hạn bên trong cookie và kiểm tra nó trong mọi yêu cầu.

+5

Nhưng đó không phải là vì ASP.NET cookie suck. Http Response Cookies chỉ không có thông tin này. –

50

Vấn đề ở đây không thực sự nằm trong ASP.NET nhưng với lượng thông tin được cung cấp trong yêu cầu http của trình duyệt. Ngày hết hạn sẽ không thể thực hiện bất kể nền tảng bạn đang sử dụng ở phía máy chủ.

Khi bạn đã tóm tắt chính mình trong câu hỏi, thuộc tính Expires của đối tượng HttpCookie được cung cấp bởi đối tượng HttpRequest luôn được đặt là 1/1/0001 12:00 SA. Điều này là do thông tin hết hạn này, cũng như các thuộc tính như tên miền và đường dẫn, không được trình duyệt chuyển đến máy chủ khi nó gửi yêu cầu. Thông tin cookie duy nhất được gửi là tên và (các) giá trị. Do đó, cookie trong yêu cầu sẽ có giá trị mặc định cho các trường 'thiếu' này vì chúng không được biết ở phía máy chủ.

Tôi đoán lý do đằng sau điều này là thuộc tính hết hạn, tên miền và đường dẫn của cookie chỉ được sử dụng bởi trình duyệt khi quyết định có nên chuyển cookie trong yêu cầu hay không không và máy chủ chỉ quan tâm đến tên và giá trị.

Công việc xung quanh bạn đã gợi ý sao chép thời gian hết hạn vì một giá trị khác của cookie là cách để có được hành vi bạn đang tìm kiếm.

4

Lúc đầu, tôi cũng thất vọng vì sao Cookie yêu cầu không có giá trị Hết hạn thực tế. Sau khi gỡ lỗi http bằng cách sử dụng Fiddler2. Tôi biết rằng .NET không sai, thay vào đó, giao thức http là câu trả lời tại sao Yêu cầu cookie hoạt động như vậy.

Nếu bạn sử dụng Fiddler giữa ứng dụng và trình duyệt của mình. Bạn có thể thấy cookie Phản hồi được gửi chính xác đến trình duyệt với tất cả tên miền, đường dẫn, hết hạn, bảo mật và httponly. Tuy nhiên, cookie Yêu cầu tiếp theo trong tiêu đề cookie http không có giá trị hết hạn, nó chỉ có tên và giá trị cookie. Trình duyệt chịu trách nhiệm gửi tiêu đề yêu cầu này và tôi tin rằng đó là vì giao thức http. Lý do tại sao là vì để giảm thiểu kích thước và máy chủ web không cần phải kiểm tra nó vì chúng thực sự thiết lập tất cả các giá trị. Họ nên chú ý.

Vì vậy, bạn không cần phải kiểm tra giá trị hết hạn trên yêu cầu web vì bạn đã biết ngày. Chỉ cần, nếu bạn nhận được cookie trở lại có nghĩa là cookie chưa hết hạn.Khi bạn đặt hết hạn, trình duyệt sẽ xử lý hết hạn. Nếu bạn muốn thay đổi hết hạn, chỉ cần đặt giá trị mới trên phản hồi.

CallMeLaNN

0

Tôi gặp sự cố tương tự khi thử nghiệm với Iphone. Vấn đề là do Iphone có thời gian đặt sai ngày trên thiết bị, do đó việc đặt ngày hết hạn cookie thành datetime.now.adddays (-1) đã không hết hạn cookie

0

Để giải quyết vấn đề này tôi thêm xác nhận quyền sở hữu mà hiệu trưởng sau đó tôi có thể đọc lại và hiển thị các tập tin cookie thời gian hết hạn cho người sử dụng như sau:

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

sau đó, bạn có thể lấy lại thời gian hết hạn sau đó từ ClaimsPrinciple bởi

ClaimsPrincipal principle = Thread.CurrentPrincipal as ClaimsPrincipal; 
    DateTime contextExpiry = principle.Claims.First(p => p.Type == "contextExpireUtc").Value.AsDateTime(); 
Các vấn đề liên quan