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:
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:
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.
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? –
Cześć Brock/Gaurav - Czy zdołałeś ustalić, dlaczego wartość 'ValidTo' nie została ustawiona poprawnie? – Mike
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. –