2012-06-08 16 views
10

Noch ein weiteres Problem, wenn Formularauthentifizierungsticket zu früh abläuft. Ich muss Gleitende Ablaufmenge auf True setzen. Ich habe Foren gelesen und das Problem mit dem Genauigkeitsverlust verstanden, dass das Ticket nur dann aktualisiert wird, wenn die Anfrage erst nach der Hälfte der Ablaufzeit erfolgt.Formularauthentifizierungsticket manuell erneuern:

Das Problem: In meinem webconfig Ich habe wie folgt:

<authentication mode="Forms"> 
     <forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" /> 
    </authentication> 
    <sessionState timeout="20" /> 
    <authorization> 

Der Benutzer nur auf login.aspx umgeleitet abgemeldet und müssen nur dann, wenn es keine Anforderung im 20-Minuten-Intervall gemacht war. Das Problem besteht darin, dass Benutzer Anfragen stellen und dennoch auf die Anmeldeseite gelangen. Dies sollte nicht passieren. Was ich dachte, war, den SqlAuthCookie für jede Anfrage manuell zurückzusetzen.

Unten ist mein Code. Es wird auf context.AcquireRequestState aufgerufen.

void context_AcquireRequestState(object sender, EventArgs e) 
    { 
     HttpContext ctx = HttpContext.Current; 
     ResetAuthCookie(ctx); 
    } 

      private void ResetAuthCookie(HttpContext ctx) 
    { 
     HttpCookie authCookie = ctx.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null) 
      return; 

     FormsAuthenticationTicket ticketOld = FormsAuthentication.Decrypt(authCookie.Value); 
     if (ticketOld == null) 
      return; 

     if (ticketOld.Expired) 
      return; 

     FormsAuthenticationTicket ticketNew = null; 
     if (FormsAuthentication.SlidingExpiration) 
      ticketNew = FormsAuthentication.RenewTicketIfOld(ticketOld); 

     if (ticketNew != ticketOld) 
      StoreNewCookie(ticketNew, authCookie, ctx); 
    } 

    private void StoreNewCookie(FormsAuthenticationTicket ticketNew, HttpCookie authCookie, HttpContext ctx) 
    { 
     string hash = FormsAuthentication.Encrypt(ticketNew); 
     if (ticketNew.IsPersistent) 
      authCookie.Expires = ticketNew.Expiration; 

     authCookie.Value = hash; 
     authCookie.HttpOnly = true; 

     ctx.Response.Cookies.Add(authCookie); 
    } 

Meine Fragen sind:

  1. Ist es falsch, oder eine akzeptable Lösung, bei jeder Anfrage das Cookie zurückzusetzen?
  2. Warum funktioniert es immer noch nicht? Es scheint, dass das neue Ticket nie erneuert wird.
  3. Gibt es andere mögliche Ursachen für die Tatsache, dass die Benutzer ihre Formularauthentifizierung zu schnell abgelaufen haben, die ich untersuchen sollte?

Danke, Grüße,

+0

Welche Version von Framework und IIS verwenden Sie? –

+0

Zielrahmen für das Projekt ist 4.0. IIS-Version ist 7, aber ich teste auf dem Visual Studio 2010 integrierten Webserver –

+0

Ich denke, Sie sollten Domain-Attribut in Forms-Tag geben. Keine Notwendigkeit, erneuernde Cookies bei jeder Anfrage zu schreiben –

Antwort

14

Ein Formularauthentifizierungscookie erneuert sich nur nach einer halben es Ablaufzeit ist verstrichen ist.

Von Microsoft:

Wenn die Webseite zugegriffen wird, bevor die Hälfte der Ablaufzeit vergeht, das Ticket Ablaufzeit wird nicht zurückgesetzt. Wenn beispielsweise auf eine Web-Seite erneut um 5:04 00:00:00 PM zugegriffen wird, werden die Zeitlimits für Cookies und Ticket nicht zurückgesetzt.

beeinträchtigter Leistung zu vermeiden, und mehrere Browser Warnungen für Benutzer zu vermeiden, die Cookie-Warnungen aktiviert haben, wird das Cookie aktualisiert, wenn mehr als die Hälfte der angegebenen Zeit abgelaufen ist.

Dies könnte Ihr Problem sein. Wenn Ihre Kunden Ihre Website auf die 9-Minuten-Marke zugreifen und 10 Minuten lang nicht mehr darauf zugreifen, wird das Zeitlimit überschritten. Dies tritt auf, obwohl das Sitzungszeitlimit auf 20 Minuten festgelegt ist.

Manuelles Aktualisieren Ihres Tickets, wie Sie es tun, ist nicht notwendig. Sie müssen nur gleitende Ablauf aktiviert haben. Wenn die Regel "die Hälfte der spezifischen Zeit" für Sie nicht funktioniert, müssen Sie sich andere Lösungen ansehen.

+1

Wir haben es das gleiche Problem. Ich habe vor diesem Artikel einen MS-Artikel gefunden. Ein Großteil der Informationen ist hier. https://support.microsoft.com/en-us/kb/910443 – Shrini