2010-12-20 8 views
1

Ich implementiere einen Authentifizierungs-Timeout-Erkennungsmechanismus nach einer vorherigen Frage und Antwort von mir here. Ich habe ein HTTP-Modul implementiert, das das AuthenticateRequest-Ereignis zum Ausführen von Code verwendet, um zu erfassen, ob der Authentifizierungszeitraum abgelaufen ist. Der Code, dies zu tun ist unten:ASP.NET: Warum ist FormsAuthenticationTicket nach dem Authentifizierungstimeout ungültig?

public class AuthenticationModule : IHttpModule 
{ 
    #region IHttpModule Members 
    void IHttpModule.Dispose() { } 
    void IHttpModule.Init(HttpApplication application) 
    { 
     application.AuthenticateRequest += new EventHandler(this.context_AuthenticateRequest); 
    } 
    #endregion 


    /// <summary> 
    /// Inspect the auth request... 
    /// </summary> 
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks> 
    private void context_AuthenticateRequest(object sender, EventArgs e) 
    { 
     HttpApplication a = (HttpApplication)sender; 
     HttpContext context = a.Context; 

     // Extract the forms authentication cookie 
     string cookieName = FormsAuthentication.FormsCookieName; 
     HttpCookie authCookie = context.Request.Cookies[cookieName]; // no longer a forms cookie in this array once timeout has expired 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      DateTime expirationTime = authTicket.Expiration; 
      // check if previously authenticated session is now dead 
      if (authTicket != null && authTicket.Expired) 
      { 
       // send them a Response indicating that they've expired. 
      } 
     } 
    } 
} 

Das Problem ist, dass, sobald die Authentifizierungszeit abgelaufen ist (ich es 1 min bis Testset), gibt es nicht mehr Formen Cookie (siehe Kommentar in Code) . Dies bedeutet, dass der Authentifizierungscookie null ist, und ich werde es nicht über die Nullprüfung in meinem Code hinaus schaffen. Aber es gibt eine praktische "Expired" -Eigenschaft für ein FormsAuthenticationTicket, von der ich glaube, dass ich überprüfen sollte, ob der Zeitraum abgelaufen ist. Aber wie komme ich so weit, wenn der Cookie nicht mehr da ist? Ist es vernünftig anzunehmen, dass der Authentifizierungszeitraum abgelaufen ist, wenn kein Formular-Cookie mehr vorhanden ist?

Irgendwelche Hilfe würde auf diesem geschätzt werden.

Antwort

0

Sie möchten vielleicht etwas versuchen:

if (User != null) 
     { 
      FormsIdentity id = (FormsIdentity)User.Identity; 
      FormsAuthenticationTicket ticket = id.Ticket; 
      if (ticket.Expired) 
      { 
       //do something 
      } 
     } 

More info

Edit:

1: Ich sehe den Benutzer null sein wird. Die Verwendung von User.Identity kommt also nicht in Frage.

2: Testen Sie den Code, den Sie in der ursprünglichen Frage im BeginRequest-Ereignis anstelle von AuthenticateRequest haben.

+0

Ich habe es gerade erst versucht, bevor Sie es gepostet haben, aber User * ist * null, wenn der Authentifizierungszeitraum abgelaufen ist. Also .. schon wieder .. Ich kann die Abgelaufene Eigenschaft des Tickets nicht überprüfen. –

+0

Ich sehe, ein schlechter Zug. Ich habe meine Antwort bearbeitet. – gbs

0

Wenn IsPersistent auf dem FormsAuthenticationTicket auf false gesetzt ist, wird kein persistentes Cookie gesetzt. Wenn das Ticket abläuft, wird das Cookie nicht mit der Anfrage gesendet, daher können Sie nicht darauf zugreifen.

0

Dieses Verhalten wird von System.Web.Security.FormsAuthenticationModule gesteuert. Dieses Modul prüft, ob das Ticket abgelaufen ist und lösche in diesem Fall das Cookie.

Beachten Sie auch, dass dieses Modul die Option gleitendeExpiration überprüft und das Ticket bei Bedarf erneuert.

auf Ihre Frage Also zurück:

Ist es vernünftig, die Authentifizierungs-Periode zu übernehmen abgelaufen ist, wenn es nicht mehr ist ein Formen Cookie?

Die Antwort, die ich denke, ist ja.

Verwandte Themen