1

フォーム認証メカニズムがブラウザーから認証 Cookie を既に受信して検証した後、ユーザーが存在しなくなった場合 (またはその他の条件)、認証 Cookie を取り消す必要があります。つまり、使用シナリオは次のとおりです。

  1. ユーザーは認証され、無期限の認証 Cookie が付与されました。
  2. 数日後、ユーザーが再度 Web アプリにアクセスしようとすると、Cookie が有効であるため、フォーム認証メカニズムによってアクセスが許可されます。

  3. ここで、2 番目のチェック (必要な条件は何でも) を実行し、ユーザーに続行させるか、認証を取り消すかを決定します。

問題は、これに対する公式の自動化された方法はありますか? これまでのところ、いくつかの可能性がありますが、どれが優れているかはわかりません。global.asax で Authenticate イベントをキャプチャし、必要なものを確認し、無効にするために Cookie をクリアしてから、次のいずれかを実行できます。

  1. 同じ URL に再度リダイレクトします - 今回はフォーム認証が失敗し、ログオン ページにリダイレクトされるため、これは機能するはずです。

  2. いくつかの例外をスローしますか??? 何も指定せずにリダイレクトを発生させるのはどれですか?

  3. どういうわけか、構成ファイルからログオンページの URL を取得し (どのように/どの構成ハンドラーを使用するかについてのアイデア)、直接リダイレクトするにはどうすればよいですか?

  4. 私が見落としたいくつかの FormsAuthentication クラス/メソッドは、このために設計されていますか?

  5. 他のアイデアはありますか?

4

2 に答える 2

3

これを達成するための自動化された方法はないと思います。最善の方法は、ユーザーが存在するかどうかを最後に確認した日付を認証 Cookie に追加することだと思います。したがって、ユーザーがログインすると、次のようになります。

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1, // Ticket version
                name, // Username associated with ticket
                DateTime.Now, // Date/time issued
                DateTime.Now.AddMonths(1), // Date/time to expire
                true, // "true" for a persistent user cookie
                DateTime.Now.ToUniversalTime(), // last time the users was checked
                FormsAuthentication.FormsCookiePath);// Path cookie valid for

        // Encrypt the cookie using the machine key for secure transport
        string hash = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(
            FormsAuthentication.FormsCookieName, // Name of auth cookie
            hash); // Hashed ticket

        cookie.HttpOnly = true;

        // Set the cookie's expiration time to the tickets expiration time
        if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
        //cookie.Secure = FormsAuthentication.RequireSSL;
        Response.Cookies.Add(cookie);

次に、ユーザーが認証されるたびに、認証チケットに渡した追加の日付を確認し、10 分以内の間隔で、ユーザーが存在するかどうかをデータベースに対して再確認できます。コードは次のようになります。

public void FormsAuthentication_OnAuthenticate(object sender, 
                           FormsAuthenticationEventArgs args)
    {
        if (FormsAuthentication.CookiesSupported)
        {
            if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
            {
                try
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
                      Request.Cookies[FormsAuthentication.FormsCookieName].Value);

                    DateTime lastCheckedTime = DateTime.TryParse(ticket.UserData);
                    TimeSpan elapsed = DateTime.Now - lastCheckedTime;
                    if (elapsed.TotalMinutes > 10)//Get 10 from the config
                    {
                        //Check if user exists in the database. 
                        if (CheckIfUserIsValid())
                        {
                            //Reset the last checked time
                            // and set the authentication cookie again
                        }
                        else
                        {
                            FormsAuthentication.SignOut();
                            FormsAuthentication.RedirectToLoginPage();
                            return;
                        }
                    }

                }
                catch (Exception e)
                {
                    // Decrypt method failed.
                }
            }
        }
    }

過去 10 分間に削除されたユーザーをキャッシュして、そのコレクションと照合することもできます。

それが役立つことを願っています。

于 2008-12-01T23:59:55.420 に答える
0

セッションの期限切れ以外の理由で Cookie を拒否する場合は、ユーザーがアクセスするために何をする必要があるかを説明するページにユーザーをリダイレクトする必要があると思います。再度ログオンするだけで十分な場合は、ログオン ページで十分です。ただし、単純に再ログオンできない条件があるようです。そのような場合は、サイトにアクセスできない理由と (可能であれば) 再度アクセスする方法を説明する適切なエラー ページにユーザーをリダイレクトすることをお勧めします。

于 2008-12-02T02:33:51.460 に答える