簡體   English   中英

如何在ASP.NET中處理表單身份驗證超時異常?

[英]How can I handle forms authentication timeout exceptions in ASP.NET?

如果會話已過期且用戶單擊指向另一個webform的鏈接,則asp.net身份驗證會自動將用戶重定向到登錄頁面。

但是,有些用戶沒有點擊指向其他網絡表單的鏈接。 例如:在gridviews中編輯鏈接,當使用帶有文本框的AutoCompleteExtender並且應用程序嘗試獲取信息時,基本上,在每種情況下,當回發完成並且事件不是由asp.net身份驗證自動處理時。

處理這些異常的最佳方法是什么?

更新:我剛剛修改了問題標題:表單身份驗證超時,而不是初始會話超時。 謝謝你讓我意識到這種差異。

更新:我剛剛針對我面臨的具體問題創建了一個新問題: 如何使用UpdatePanel處理因過期身份驗證票據而導致的異常? 令人驚訝的是,我沒有找到關於它的更多信息。 我將衷心感謝您的幫助。

這就是為什么許多系統在頁面上包含計時器以給出大致的超時時間。 交互式頁面很難實現。 你真的需要掛鈎ajax函數並查看返回狀態代碼,這有點困難。 一種替代方法是使用基於以下內容的代碼,該代碼在頁面生命周期的早期運行並執行ajax重定向到登錄頁面。 否則你會試圖攔截來自ajax和asp.net的返回代碼,其中ajax是為你做的(即不是像jQuery這樣的更手動的方法)你會失去這種易於檢測。

http://www.eggheadcafe.com/tutorials/aspnet/7262426f-3c65-4c90-b49c-106470f1d22a/build-an-aspnet-session-timeout-redirect-control.aspx

快速入侵你可以直接在pre_init http://forums.asp.net/t/1193501.aspx上試試

編輯表單身份驗證超時所需的內容,而不是會話超時。 表單身份驗證超時的運行時間與會話超時不同。 會話超時隨每個請求更新。 表格身份驗證票據實際上沒有更新,直到有一半的時間流逝。 因此,如果您將超時設置為一小時並在一個請求中發送25分鍾,則會話將重置為一小時超時,表單身份驗證票未觸及並在35分鍾后到期! 要解決此問題,請同步會話超時和表單身份驗證票證。 這樣您仍然可以只檢查會話超時。 如果您不喜歡這樣,那么仍然 - 執行以下操作並同步超時,然后解析身份驗證票並讀取其超時。 您可以使用FormsAuthentication.Decrypt執行此操作 - 請參閱:

從asp.net代碼后面讀取表單身份驗證cookie

請注意,此代碼要求在登錄時設置一些會話值 - 在本例中為“UniqueUserId”。 同時更改下面的登錄頁面路徑以適合您的。


protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            //Only access session state if it is available
            if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
            {
                //If we are authenticated AND we dont have a session here.. redirect to login page.
                HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                if (authenticationCookie != null)
                {
                    FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
                    if (!authenticationTicket.Expired)
                    {
                        if (Session["UniqueUserId"] == null)
                        {
                            //This means for some reason the session expired before the authentication ticket. Force a login.
                            FormsAuthentication.SignOut();
                            Response.Redirect("Login.aspx", true);
                            return;
                        }
                    }
                }
            }
        }

如果您正在使用表單身份驗證,則在表單身份驗證票證到期時,用戶將被重定向到登錄頁面,這與會話到期時不同。

如果合適,您可以考慮增加表單身份驗證超時。 甚至到使用持久性cookie的程度。 但如果它到期,那么重定向到登錄頁面沒有其他替代方案 - 其他任何東西都是不安全的。

處理會話超時的一種方法是使用Session作為緩存 - 並保留對后備存儲(如數據庫)重要的任何內容。 然后在訪問Session中的任何內容之前檢查並在必要時刷新:

MyType MyObject
{
    get
    {
        MyType myObject = Session["MySessionKey"] as MyType
        if (myObject == null)
        {
            myObject = ... get data from a backing store
            Session["MySessionKey"] = myObject;  
        }
        return myObject;
    }
    set
    {
        Session["MySessionKey"] = value;
        ... and persist it to backing store if appropriate
    }
}

如果您正在使用母版頁或基頁,我會在頁面生命周期中的一個事件中添加一些邏輯來檢查會話是否是新的:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session.IsNewSession)
    {
        //do whatever you need to do
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM