2013-07-28 16 views
7

Sto tentando di implementare la scadenza della sessione scorrevole. Sto usando Windows Azure ACS, .Net 4.5, WIF. Quando ho ricevuto il token, quello che sto facendo è impostando il suo tempo di scadenza predefinita a 2 ore e scrivere quella pedina in cookie come mostrato nel seguente codice:WIF SessionSecurityToken Scadenza

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

A questo punto, se controllo il ValidFrom e ValidTo proprietà della variabile sessionToken, ottengo i valori corretti, come mostrato nello screenshot qui sotto:

enter image description here

Ora per implementare scorrevole scadenza della sessione, sto maneggiando SessionAuthenticationModule_SessionSecurityTokenReceived evento nel mio file Global.asax come illustrato di seguito:

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

Tuttavia quando controllo le ValidFrom e ValidTo proprietà del token, non è quello che ho impostato quando stavo scrivendo il token come il cookie, come mostrato nello screenshot qui sotto:

enter image description here

Non sono sicuro del perchè ciò stia succedendo. Qualcuno può spiegare cosa sto sbagliando.

UPDATE:

Ecco una cosa interessante che ho notato. Il modo in cui ho implementato la sessione scorrevole è che controllo la proprietà ValidTo del token e la confronti con la data/ora corrente (in UTC). Se la differenza è inferiore a 5 minuti, ho aumentare il tempo ValidTo da 2 ore e ripetere il cookie, come mostrato nel seguente codice:

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

Ora, dopo che se controllo il valore della ValidTo proprietà a richieste successive, in realtà sta onorando il valore che imposto come mostrato di seguito. E questo valore ottiene una richiesta persistente dopo la richiesta, cioè, una volta che ho riemesso il token, tutto funziona bene.

enter image description here

risposta

1

Thinktecture IdentityModel ha un'implementazione, in modo da poter creare un riferimento al pacchetto tramite NuGet oppure si può semplicemente copiare il codice sorgente:

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

+0

Grazie Brock. Tuttavia, non capisco ancora perché il valore 'ValidTo' non sia impostato su un valore che volevo. È un bug con WIF o sto facendo qualcosa di sbagliato? –

+1

Ciao Brock/Gaurav: sei riuscito a capire perché il valore 'ValidTo' non è stato impostato correttamente? – Mike

+1

Scusa ... avrei dovuto aggiornare la risposta molto tempo fa. In sostanza, la scadenza predefinita del token è impostata nel portale di Windows Azure ACS. Qualunque valore sia impostato, viene selezionato per la prima volta. HTH. –