2013-07-28 30 views
7

Tôi đang cố gắng triển khai hết hạn phiên trượt. Tôi đang sử dụng Windows Azure ACS, .Net 4.5, WIF. Khi lần đầu tiên tôi nhận được dấu hiệu, những gì tôi đang làm là thiết lập thời gian hết hạn mặc định của nó đến 2 giờ và viết rằng thẻ vào bánh như trong đoạn code dưới đây:WIF SessionSecurityToken Expiration

internal void SetSession(ClaimsPrincipal principal) 
{ 
    var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120)); 
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); 
    Thread.CurrentPrincipal = principal; 
} 

Tại thời điểm này, nếu tôi kiểm tra ValidFromValidTo thuộc tính của biến sessionToken, tôi nhận được các giá trị thích hợp như thể hiện trong hình dưới đây:

enter image description here

Bây giờ để thực hiện trượt phiên hết hạn, tôi đang xử lý SessionAuthenticationModule_SessionSecurityTokenReceived sự kiện trong tập tin Global.asax tôi như hình dưới đây:

void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
    { 
     var sessionToken = e.SessionToken; 
    } 

Tuy nhiên khi tôi kiểm tra ValidFromValidTo thuộc tính của thẻ, nó không phải là những gì tôi thiết lập khi tôi đang viết những dấu hiệu như cookie như thể hiện trong hình dưới đây:

enter image description here

Không chắc chắn lý do tại sao điều này xảy ra. Ai có thể giải thích những gì tôi đang làm sai.

UPDATE:

Dưới đây là một điều thú vị tôi nhận thấy. Cách tôi đã thực hiện phiên trượt là tôi kiểm tra thuộc tính ValidTo của mã thông báo và so sánh với ngày/giờ hiện tại (theo UTC). Nếu sự khác biệt là chưa đầy 5 phút, tôi tăng ValidTo thời gian bằng cách 2 giờ và phát hành lại cookie như trong đoạn code dưới đây:

void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) 
    { 
     var sessionToken = e.SessionToken; 
     var currentDateTime = DateTime.UtcNow.Ticks; 
     var sessionExpirationDateTime = sessionToken.ValidTo.Ticks; 
     if (sessionExpirationDateTime >= currentDateTime) 
     { 
      var renewTokenWindow = 5 * 60 * 1000;//5 minutes 
      TimeSpan ts = new TimeSpan(sessionExpirationDateTime - currentDateTime); 
      if (ts.TotalMilliseconds < renewTokenWindow) 
      { 
       var newSessionTokenExpiry = sessionToken.ValidTo.AddMinutes(120); 
       //Renew token 
       SessionAuthenticationModule sam = sender as SessionAuthenticationModule; 
       var newSessionToken = sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal, sessionToken.Context, sessionToken.ValidFrom, newSessionTokenExpiry, sessionToken.IsPersistent); 
       e.SessionToken = newSessionToken; 
       e.ReissueCookie = true; 
      } 
     } 
    } 

Bây giờ sau đó nếu tôi kiểm tra giá trị của ValidTo tài sản trong các yêu cầu tiếp theo, nó thực sự tôn vinh giá trị tôi đang thiết lập như hình dưới đây. Và giá trị này được yêu cầu liên tục sau khi yêu cầu tức là khi tôi phát hành lại mã thông báo, mọi thứ đều hoạt động tốt.

enter image description here

Trả lời

1

Thinktecture IdentityModel có một thực hiện, vì vậy bạn có thể tham khảo các gói qua NuGet hoặc bạn chỉ có thể sao chép mã nguồn:

http://brockallen.com/2013/02/17/sliding-sessions-in-wif-with-the-session-authentication-module-sam-and-thinktecture-identitymodel/

+0

Cảm ơn Brock. Tuy nhiên tôi vẫn không hiểu tại sao giá trị 'ValidTo' không được đặt thành giá trị tôi muốn. Nó là một lỗi với WIF hoặc tôi đang làm một cái gì đó không chính xác? –

+1

Hi Brock/Gaurav - Bạn đã tìm ra lý do tại sao giá trị 'ValidTo' không được đặt chính xác? – Mike

+1

Xin lỗi ... Tôi đã cập nhật câu trả lời từ lâu. Về cơ bản, hết hạn mã thông báo mặc định được đặt trong cổng Windows Azure ACS. Bất cứ giá trị nào được đặt ở đó đều được chọn lần đầu tiên. HTH. –

Các vấn đề liên quan