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:
- Ist es falsch, oder eine akzeptable Lösung, bei jeder Anfrage das Cookie zurückzusetzen?
- Warum funktioniert es immer noch nicht? Es scheint, dass das neue Ticket nie erneuert wird.
- 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,
Welche Version von Framework und IIS verwenden Sie? –
Zielrahmen für das Projekt ist 4.0. IIS-Version ist 7, aber ich teste auf dem Visual Studio 2010 integrierten Webserver –
Ich denke, Sie sollten Domain-Attribut in Forms-Tag geben. Keine Notwendigkeit, erneuernde Cookies bei jeder Anfrage zu schreiben –