7

ASP.Net セッションがタイムアウトし (フォーム認証も)、ページにアクセスしようとすると、既定の login.aspx ページに自動的にリダイレクトされます。

ページが読み込まれる前に、これがタイムアウトの状況であるかどうかを判断する必要があります。タイムアウトの場合は、timeout.aspx にリダイレクトします。

以下の記事では、IsNewSession が true で、sessionID Cookie が存在する場合、タイムアウト状態になることを示しています。

ただし、私のテストでは、タイムアウトして再度ログインしようとすると、IsNewSession が true に等しく、sessionId Cookie がまだぶら下がっている (ブラウザー セッション全体で保持されるため) という状況が発生したため、時間を計ったと表示されます。 -再度ログインしようとしているときにもう一度アウトします。

これをすべて行うより良い方法はありますか?

テクニックはここここに記載されています。

私の「global.asax」ファイルには次のものがあります。

void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
        // Check if session state is enabled in web.config
        if (Context.Session == null) return;

        if (Session["user"] == null) 
        {
            if (Session.IsNewSession)
            {                    
                HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
                if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value))
                {
                    /* Session Timeout! */
                    FormsAuthentication.SignOut(); //just in case not done yet
                    Session.Abandon();
                    Response.Redirect("timeout.aspx");
                }
                else
                {
                    // Cookie didn't exist - must be a brand new login
                    return;
                }
            }
            else
            {
                // If there is no session data and the session is not new then it must be the postback of the login screen.
                if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST"))
                {
                    return;
                }
            }
        }    
}
4

2 に答える 2

7

タイムアウト セッションと手動でログアウトされたセッションを区別しようとしていますか?

あなたの問題は、セッションデータがなくなったので、あなたが続けなければならないのは、入ってくる新しいリクエストが新しいセッションを作成し、入ってくるリクエストがセッションID Cookieを運ぶことです(以前にログインしたことを示します)。

2 つのアプローチがあります。

クッキー:

まず、ログイン ページで、ユーザーのログイン ステータスを示す追加の Cookie を作成できます。ユーザーが手動でログアウトすると、ログアウトを示すように Cookie 値が変更されます。セッションがタイムアウトした後のリクエストは、IsNewSessiontrue に加えて、ユーザーがまだログインしていることを示すログイン ステータス Cookie も持つため、ユーザーが手動でログアウトを選択していないことを示します。

データベース:

2 番目の方法は、セッション ID をログイン ステータスと共に DB テーブルに格納することです。ログオンが成功したら、セッション ID を LoggedOnSessions テーブルに入力します。ユーザーが手動でログオフするときに、テーブルから sessionID を削除します。したがって、タイムアウトの検出には、セッション ID がタイムアウトである場合、テーブル内のセッション ID のルックアップを含めることができます (この時点で、おそらく ID も削除する必要があります)。

ハウスキーピングの目的で、実際のログオン期間 (たとえば 1 週間) よりもはるかに長く設定された有効期限フィールドを含める必要があります。定期的に (毎週など)、有効期限が切れたテーブルのエントリを削除します。

私の好みは、Cookie の設定が嫌いなデータベース アプローチです。

于 2009-01-09T09:34:36.037 に答える
-1

タグauthenticationの下の web.config ファイルを調べることもできます。これは次のようになります。

<authentication mode="Windows">
  <forms defaultUrl="Default.aspx" loginUrl="Login.aspx" name=".aspxAuth">
  </forms>
</authentication>

属性modeに注意してください。おそらく、web.config ファイルで Window ではなく Forms と表示されています。この場合、セッションを失ってから任意のリンク (SalesChart.aspx としましょう) をクリックすると、ASP.NET は、SalesChart.aspx 分離コードではなく直接 Login.aspx 分離コードに移動します。これは特に厄介です。

Windows モードを試すと、要求されたページ (SalesChart.aspx) に毎回移動し、セッションが失われた場合に実行するアクションを自分で決定します。

于 2009-05-19T12:53:09.437 に答える