首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 登出機制完整實作:Session 清除、瀏覽器快取控制與 MasterPage 事件陷阱

     編輯:ASP.NET 基礎

完整登出流程三步驟

1. 登入成功:建立 Session

Session["id"] = user.id.ToString();
Session["name"] = user.name.ToString();
Session["pwd"] = user.password.ToString(); // 實務不建議存明文密碼
Session["time"] = user.LoginTime.ToString();
Session["authority"] = user.limits.ToString();

2. 每頁驗證:Page_Load 攔截未登入

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["id"] == null || Session["name"] == null || 
        Session["time"] == null || Session["authority"] == null || Session["pwd"] == null)
    {
        Response.Redirect("~/Login.aspx", true);
    }
    
    if (!IsPostBack)
    {
        // 頁面初始化邏輯
    }
}

3. 登出事件:清除 Session 與瀏覽器快取

public void Clear(object sender, EventArgs e)
{
    Session["id"] = null;
    Session["name"] = null;
    ClearClientPageCache();
    Response.Redirect("~/Login.aspx");
}

public void ClearClientPageCache()
{
    Response.Buffer = true;
    Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
    Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
    Response.Expires = 0;
    Response.CacheControl = "no-cache";
    Response.Cache.SetNoStore();
}

MasterPage 連結按鈕的事件綁定陷阱

錯誤寫法:使用 <a> 標籤 + onclick 呼叫伺服器方法

<a href="~/Login.aspx" class="atop" target="_self" onclick="clear()">帳戶資訊</a>
<script>
function clear() { <%Clear();%> }
</script>

問題:<%Clear();%> 在頁面**載入時**即執行,非點擊時。導致每次換頁都清除 Session,造成無限重導向登入頁。

正確寫法:使用 runat="server" 的 HtmlAnchor 或 LinkButton

<a class="atop" runat="server" onserverclick="Clear">登出系統</a>
// 後置碼
public void Clear(object sender, EventArgs e)
{
    Session["id"] = null;
    Session["name"] = null;
    ClearClientPageCache();
    Response.Redirect("~/Login.aspx");
}

onclick vs onserverclick 關鍵差異

屬性觸發端執行程式碼適用元素
onclick客戶端JavaScriptHTML 標準元素
onserverclick伺服器C# / VB.NETrunat="server" 的 HtmlControls
  • onclick:瀏覽器端事件,無法直接呼叫伺服器方法。若在 JS 中寫 <% %> 會在**伺服器轉譯階段**立即執行。
  • onserverclick:需搭配 runat="server",觸發 Postback 執行伺服器端事件處理常式。

瀏覽器快取控制標頭詳細說明

屬性/方法作用
Response.Buffer = true啟用緩衝,先存記憶體再輸出
Response.ExpiresAbsolute = 過去時間設定絕對過期時間(HTTP 1.0)
Response.Cache.SetExpires(過去時間)設定 Cache-Control: max-age=0(HTTP 1.1)
Response.Expires = 0立即過期(分鐘為單位)
Response.CacheControl = "no-cache"要求重新驗證
Response.Cache.SetNoStore()禁止任何快取(Cache-Control: no-store)

組合使用可最大相容性地防止瀏覽器快取敏感頁面,避免登出後按「上一頁」仍看到受保護內容。

最佳實務建議

  1. 登出功能使用 <asp:LinkButton> 或 runat="server"><a> 搭配 OnClick/OnServerClick
  2. Session 清除建議使用 Session.Abandon() 完整銷毀工作階段
  3. 密碼**絕不**存入 Session,改存雜湊值或權杖
  4. 搭配 FormsAuthentication.SignOut() 清除驗證 Cookie
  5. 登入頁面輸出 Cache-Control: no-store 防止快取
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved