12

フォーム認証チケットの有効期限が早すぎるというさらに別の問題。スライド式の有効期限を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);
    }

私の質問は次のとおりです。

  1. リクエストごとにCookieをリセットするのは間違っているのですか、それとも許容できる解決策ですか?
  2. それでも機能しないのはなぜですか?新しいチケットは更新されないようです。
  3. ユーザーのフォーム認証の有効期限が早すぎるという事実のために、他に考えられる原因はありますか?調査する必要がありますか?

ありがとう、よろしく、

4

1 に答える 1

15

フォーム認証Cookieは、有効期限の半分が経過した後にのみ更新されます。

Microsoftから:

有効期限の半分が経過する前にWebページにアクセスした場合、チケットの有効期限はリセットされません。たとえば、午後5:04 00:00:00にWebページに再度アクセスした場合、Cookieとチケットのタイムアウト期間はリセットされません。

パフォーマンスの低下を防ぎ、Cookieの警告がオンになっているユーザーに対する複数のブラウザーの警告を回避するために、指定された時間の半分以上が経過するとCookieが更新されます。

これはあなたの問題かもしれません。クライアントが9分マークでサイトにアクセスし、10分間再度アクセスしない場合、クライアントはタイムアウトになります。これは、セッションタイムアウトが20分に設定されている場合でも発生します。

手動でチケットを更新する必要はありません。スライド式の有効期限を有効にする必要があります。「特定の時間の半分」のルールが機能しない場合は、他の解決策を検討する必要があります。

于 2012-10-11T20:22:01.157 に答える