フォーム認証チケットの有効期限が早すぎるというさらに別の問題。スライド式の有効期限をtrueに設定して使用する必要があります。私はフォーラムを読み、精度の低下の問題を理解しました。チケットは、有効期限の半分の時間後にのみリクエストが行われた場合にのみ更新されます。
問題:私のwebconfigには、次のようなものがあります。
<authentication mode="Forms">
<forms timeout="20" name="SqlAuthCookie" protection="All" slidingExpiration="true" />
</authentication>
<sessionState timeout="20" />
<authorization>
ユーザーは、20分間隔でリクエストが行われなかった場合にのみ、ログアウトしてlogin.aspxにリダイレクトする必要があります。問題は、ユーザーがリクエストを行っているにもかかわらず、ログインページにスローされることです。これは起こらないはずです。私が考えたのは、リクエストごとにSqlAuthCookieを手動でリセットすることでした。
以下は私のコードです。これはcontext.AcquireRequestStateで呼び出されます。
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);
}
私の質問は次のとおりです。
- リクエストごとにCookieをリセットするのは間違っているのですか、それとも許容できる解決策ですか?
- それでも機能しないのはなぜですか?新しいチケットは更新されないようです。
- ユーザーのフォーム認証の有効期限が早すぎるという事実のために、他に考えられる原因はありますか?調査する必要がありますか?
ありがとう、よろしく、