Zaimplementowałem sesje przesuwne w mojej aplikacji Relying Party, zgodnie z opisem w Sliding Sessions for WIF 4.5. To działa tak dobrze, jak to możliwe, ale jest jeden problem, który wydaje się nikt nie mówi.Ponowne uwierzytelnianie sesji przesuwnych WIF
Jak wynika z połączonego posta na blogu, po wygaśnięciu tokena RP, przy następnym uruchomieniu żądania, token jest ponownie wystawiany ze STS. Zakładając oczywiście, że czas trwania sesji STS jest dłuższy niż czas życia sesji RP, co prawie na pewno ma miejsce w przypadku sesji przesuwnych.
W każdym razie, to całkowicie pokonuje cały punkt sesji przesuwnych.
Nikt nie mówi o tym, co należy zrobić po wygaśnięciu sesji RP. To, co chcę chce jest, jeśli sesja RP przekroczyła limit czasu (zwykle dlatego, że ktoś odszedł z jego biurka na 10 minut), jest dla mojej aplikacji przekierowanie na stronę logowania STS, gdzie użytkownik może ponownie się uwierzytelnić, a następnie zostanie przekierowany wróciłem do strony, o którą prosiłem; a może na stronę, na której byłem, kiedy złożyłem wniosek.
Jestem prawie pewien, że jest to możliwe, ale absolutnie nie mam pojęcia, jak to się robi.
Oto mój kod z global.asax:
private const int InactivityTimeout = 5; // minutes
void SessionAuthenticationModule_SessionSecurityTokenReceived
(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var now = DateTime.UtcNow;
var validFrom = e.SessionToken.ValidFrom;
var validTo = e.SessionToken.ValidTo;
double halfSpan = (validTo - validFrom).TotalMinutes/2;
if (validFrom.AddMinutes(halfSpan) < now && now < validTo)
{
// add more time
var sam = sender as SessionAuthenticationModule;
e.SessionToken = sam.CreateSessionSecurityToken(
e.SessionToken.ClaimsPrincipal,
e.SessionToken.Context,
now,
now.AddMinutes(InactivityTimeout),
e.SessionToken.IsPersistent);
e.ReissueCookie = true;
}
else
{
// re-authenticate with STS
}
}
Moje pytania:
- jest klauzula
else
właściwym miejscem, aby umieścić logikę ponownego uwierzytelniania? - Jeśli tak, proszę podać przykład, ponieważ nie mam pojęcia.
- Jeśli odpowiedź na nr 1 brzmi "nie", to czy istnieje osobne wydarzenie, które muszę zasubskrybować, które powie mi: "Hej, Twój token bezpieczeństwa sesji wygasł!"?
Dzięki za odpowiedź. Nie chcę zsynchronizować czasu życia sesji, ponieważ zmusiłoby to użytkownika do ponownego uwierzytelnienia co 10 minut. Wyobraź sobie, że musisz to zrobić podczas pracy w Visual Studio. Chcę, aby działał jak mój komputer z Windows: moja sesja pozostaje ważna tak długo, jak długo korzystam z komputera. Ale jeśli jestem bezczynny przez 5 minut, blokuje moją stację roboczą i muszę ponownie uwierzytelnić. Skojarzone wylogowanie może działać, o ile mogę wrócić do strony, na której skończyłem. Spróbuję. –
Nie widzę sposobu, w jaki użytkownik musiałby ponownie uwierzytelniać się co 10 minut, gdy zaimplementowano sesje przesuwne na RP. – klings
Jeśli ustawię czas życia sesji na 10 minut w STS zgodnie z zaleceniami, token STS wygaśnie po 10 minutach. RP nie może wydłużyć czasu życia tokena na dłużej niż pozwala token STS. Chyba że źle zrozumiałem coś, co napisałeś? –