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:
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:
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.
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? –
Ciao Brock/Gaurav: sei riuscito a capire perché il valore 'ValidTo' non è stato impostato correttamente? – Mike
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. –