2013-02-13 13 views
10

Die Authentifizierungs-, Repository- und Caching-Provider in ServiceStack bieten eine einfache Möglichkeit, Anmeldesitzungen fast ohne zusätzlichen Code zu einer Webanwendung hinzuzufügen. Ich habe festgestellt, dass das Session-Timeout für einen Authentifizierungs-Provider kann so konfiguriert werden, zum Beispiel:So beschleunigen Sie das Sitzungszeitlimit in ServiceStack

new CredentialsAuthProvider { SessionExpiry = TimeSpan.FromMinutes(10) } 

Dies stellt einen Ablauf von dem Punkt der Anmeldung. Wenn wir ein sicheres System entwickeln, das einen Benutzer nach einer kurzen Zeit abmelden muss, würden wir dies von dem Standardwert von 2 Wochen auf etwas wie das obige Beispiel ändern. Aber das hat das Problem, dass 10 Minuten nach der Anmeldung des Benutzers rausgeschmissen werden, unabhängig davon, ob sie noch mit der Anwendung interagieren oder nicht.

Gibt es eine einfache Möglichkeit, dem Sitzungsanbieter mitzuteilen, dass die Ablaufzeit verlängert wird, wenn Dienste aufgerufen werden?

Idealerweise würde es uns ermöglichen, die Sitzung für bestimmte Dienste/Anforderungen zu erweitern (so dass die Sitzung nur erweitert wird, wenn der Benutzer aktiv mit der Anwendung interagiert und die abgefragten Dienste daher ignoriert werden können).

aktualisiert

Auf der Grundlage der von mythz gegebenen Antwort jetzt wir eine einfache Lösung, die das Niveau der Kontrolle übernehmen wir von extending the ResponseFilterAttribute benötigen zur Verfügung stellt.

+2

Dies ist keine Antwort auf Ihre Frage, aber der Begriff dafür ist "gleiten". ZB gleitender Cache, gleitendes Sitzungszeitlimit, usw. – Matthew

Antwort

10

ServiceStack unterstützt "gleitende Sitzung Ablauf" automatisch noch nicht. Sie müssten den Sitzungscache-Eintrag bei jeder erfolgreichen Anforderung grundsätzlich zurücksetzen. dh Sie könnten einen Antwortfilter haben (da sie nur für authentifizierte Anforderungen ausgeführt ist), die Wieder speichert die Sitzung, die die Wirkung der Verlängerung hat es Lebenszeit von der Ablaufzeit:

var userSession = httpReq.GetSession(); 
httpReq.SaveSession(userSession, slidingExpiryTimeSpan); 

Wenn Sie wissen, welchen Caching-Provider Sie verwenden, z Redis Sie können das Ablaufzeitlimit manuell aktualisieren, ohne den Eintrag erneut zu lesen, z. B .:

var sessionKey = SessionFeature.GetSessionKey(httpReq.GetSessionId()); 
redis.ExpireEntryIn(sessionKey, slidingExpiry); //"urn:iauthsession:{sessionId}" 
+0

Danke. Vielleicht wäre ein Feature für SS in der Zukunft ein Attribut, das Sie einer Dienstanforderungsfunktion hinzufügen können, die explizit angibt, dass sie den Ablauf verschieben soll, daher wäre das Standardverhalten nicht. – Dan

+0

Ja, ich denke, eine 'EnableSlidingExpiration' Option würde funktionieren. – mythz

+2

In der Hoffnung, dass es für andere nützlich ist, [hier ist die Lösung] (http://eadriven.me.uk/2013/02/14/sliding-sessions-in-service-stack) ging ich mit basierend auf Mythz Vorschläge. – Dan

Verwandte Themen