2013-07-28 29 views
7

我試圖實現滑動會話過期。我正在使用Windows Azure ACS,.Net 4.5,WIF。當我第一次收到令牌,如我在做什麼它的默認過期時間設定爲2小時,寫令牌到餅乾在下面的代碼:WIF SessionSecurityToken到期

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

在這個時候,如果我檢查ValidFromsessionToken變量的ValidTo性質,我得到適當的值,如下面的截圖:

enter image description here

我們實現滑動會話過期,我在處理我的Global.asax文件SessionAuthenticationModule_SessionSecurityTokenReceived事件,如下圖所示:

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

然而,當我檢查令牌的ValidFromValidTo性質,它不是我,當我在寫令牌作爲cookie的如下面的截圖設置:

enter image description here

不知道爲什麼會這樣。任何人都可以解釋我做錯了什麼。

UPDATE:

下面是我注意到一個有趣的事情。我實施滑動會話的方式是檢查令牌的ValidTo屬性,並將其與當前日期/時間(UTC)進行比較。如果該差小於5分鐘,我增加ValidTo時間由2小時,並重新發出該cookie如示於以下的代碼:

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

查閱之後,如果我檢查ValidTo屬性的值在隨後的請求,它實際上是尊重我設定的價值,如下所示。並且這個值在請求後得到持續的請求,即一旦我重新發布令牌,一切都很好。

enter image description here

回答

1

Thinktecture IdentityModel有一個實現,所以你既可以通過的NuGet引用包或者你可以複製源代碼:

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

+0

謝謝布洛克。但是我仍然不明白爲什麼'ValidTo'值沒有設置爲我想要的值。這是WIF的錯誤還是我做錯了什麼? –

+1

嗨布洛克/高拉夫 - 你有沒有設法弄清楚爲什麼'ValidTo'值設置不正確? – Mike

+1

對不起......我應該很久以前就更新了答案。本質上,默認令牌到期在Windows Azure ACS門戶中設置。無論價值是什麼,都是第一次選擇。 HTH。 –