11

セッション タイムアウト時にログイン ページに自動リダイレクトしたいと考えています。

web.config ファイルには、次のコードがあります

<configuration>
    <system.web>
       <sessionState mode="InProc"  timeout="1"/>
    </system.web>
</configuration>

Global.asax ファイル内 -

protected void Session_End(object sender, EventArgs e)
{
    Response.Redirect("LoginPage.aspx");
}

しかし、タイムアウト後、次のエラーが表示されます。

HttpException がユーザー コードによって処理されませんでした。

このコンテキストでは応答を利用できません。

この問題を解決する手がかりはありますか?

4

7 に答える 7

8

Session_End は、セッションが終了したときに呼び出されます。通常、最後のリクエストから 20 分後です (たとえば、ブラウザーが非アクティブであるか閉じている場合)。
リクエストがないので、レスポンスもありません。

Application_AcquireRequestStateアクティブなセッションがない場合は、リダイレクトを行うことをお勧めします。現在の URL を確認して、ループを回避することを忘れないでください。

編集:私は認証に組み込まれた.Netsのファンではありません.例は次のGlobal.asaxとおりです:

    protected void Application_AcquireRequestState(object sender, EventArgs e)
    {
        try
        {
            string lcReqPath = Request.Path.ToLower();

            // Session is not stable in AcquireRequestState - Use Current.Session instead.
            System.Web.SessionState.HttpSessionState curSession = HttpContext.Current.Session;

            // If we do not have a OK Logon (remember Session["LogonOK"] = null; on logout, and set to true on logon.)
            //  and we are not already on loginpage, redirect.

            // note: on missing pages curSession is null, Test this without 'curSession == null || ' and catch exception.
            if (lcReqPath != "/loginpage.aspx" &&
                (curSession == null || curSession["LogonOK"] == null))
            {
                // Redirect nicely
                Context.Server.ClearError();
                Context.Response.AddHeader("Location", "/LoginPage.aspx");
                Context.Response.TrySkipIisCustomErrors = true;
                Context.Response.StatusCode = (int) System.Net.HttpStatusCode.Redirect;
                // End now end the current request so we dont leak.
                Context.Response.Output.Close();
                Context.Response.End();
                return;
            }
        }
        catch (Exception)
        {

            // todo: handle exceptions nicely!
        }
    }
于 2013-09-02T04:57:21.133 に答える
4

アプリケーションのセキュリティを維持するために何かを使用している場合FormsAuthentication、この部分 (実行しようとしている部分) は自動的に行われます。FormsAuthentication がユーザーのセッションの有効期限が切れていることを検出すると、そのユーザーをログイン ページにリダイレクトします。

次に、セッション プロバイダーをInProcからSQLServerまたはその他のアウト プロセス プロバイダーに変更するとトリガーSession_Endされないため、あまり依存しないでください。

于 2013-09-02T04:53:13.273 に答える
1

Application_AcquireRequestState を使用する必要があります。Application_AuthenticateRequest にはセッション コンテキストがなくなっている (またはセッション コンテキストがまったくない) ことがわかります。これに関する私の調査で、私はそれを解決したこの投稿に出くわしました。Waqas Raja に感謝します。

asp.net:セッションなしでユーザーをホームページにリダイレクトするコードをどこに置くのですか?

于 2013-10-29T10:08:07.907 に答える
0

私が感じる最も簡単な方法は、メタ情報を使用してトリックを機能させることです。WebPage.aspxファイルに以下のコードを追加するページがあるとしWebPage.aspx.csます。

private void Page_Load(object sender, System.EventArgs e){      
    Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));      
    if(Session[“IsUserValid”].ToString()==””)              
    Server.Transfer(“Relogin.aspx”);
}

上記のコードでWebPage.aspxは、セッションの有効期限が切れてから 5 秒後に更新されます。また、セッションが有効でなくなったため、ページの読み込み時にセッションが検証されます。ページは再ログイン ページにリダイレクトされます。サーバーへのポストバックごとにセッションが更新され、同じことが のメタ情報で更新されWebPage.aspxます。

于 2016-05-18T07:13:34.643 に答える