2013-07-28 27 views
7

Próbuję wdrożyć wygaśnięcie sesji poślizgu. Używam usługi Windows Azure ACS, .Net 4.5, WIF. Kiedy po raz pierwszy otrzyma token, co robię jest ustawienie jego domyślny czas ważności do 2 godzin i napisać, że znacznik do pliku cookie, jak pokazano w poniższym kodzie:WIF SessionSecurityToken Expiration

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

W tym czasie, jeżeli sprawdzić ValidFrom i ValidTo właściwości zmiennej sessionToken, uzyskać odpowiednie wartości, jak pokazano na poniższym zrzucie ekranu:

enter image description here

teraz zaimplementować przesuwny wygasania sesji, jestem obsługi SessionAuthenticationModule_SessionSecurityTokenReceived wydarzenie w moim pliku Global.asax jak pokazano poniżej:

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

Jednak kiedy sprawdzić ValidFrom i ValidTo właściwości tokena, nie o to mi określić, kiedy pisałem token jako cookie, jak pokazano na poniższym zrzucie ekranu:

enter image description here

Nie wiem, dlaczego tak się dzieje. Czy ktokolwiek może mi wyjaśnić, co robię źle.

UPDATE:

Oto jedna interesująca rzecz, jaką zauważyłem. Sposób, w jaki zaimplementowałem przesuwaną sesję, polega na sprawdzeniu właściwości tokena o wartości ValidTo i porównaniu jej z bieżącą datą/czasem (w UTC). Jeśli różnica jest mniejsza niż 5 minut, ja wydłużyć czas ValidTo przez 2 godziny i ponownie cookie, jak pokazano w poniższym kodzie:

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

Teraz po tym, gdybym sprawdzić wartość ValidTo nieruchomości w kolejnych żądań, w rzeczywistości uznaje wartość, którą ustawiam, jak pokazano poniżej. Ta wartość zostaje utrwalona na żądanie po żądaniu, tj. Po ponownym wysłaniu tokena wszystko działa poprawnie.

enter image description here

Odpowiedz

1

Thinktecture IdentityModel ma implementację, więc można albo odwoływać się do pakietu poprzez Nuget lub można po prostu skopiować kod źródłowy:

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

+0

Thanks Brock. Jednak nadal nie rozumiem, dlaczego wartość "ValidTo" nie jest ustawiona na wartość, którą chciałem. Czy to błąd z WIF, czy robię coś niepoprawnego? –

+1

Cześć Brock/Gaurav - Czy zdołałeś ustalić, dlaczego wartość 'ValidTo' nie została ustawiona poprawnie? – Mike

+1

Przepraszam ... Powinienem zaktualizować odpowiedź dawno temu. Zasadniczo domyślne wygasanie tokena jest ustawiane w portalu ACS systemu Windows Azure. Bez względu na to, jaka wartość jest ustawiona, jest wybierana po raz pierwszy. HTH. –

Powiązane problemy