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

ASP.NET URL 過濾模組實作:IHttpModule 攔截請求驗證 Session

     編輯:ASP.NET 基礎

核心模組類別:Filters

實作 IHttpModule 與 IRequiresSessionState,在 AcquireRequestState 事件攔截請求,檢查 Session 是否存在,未登入導向預設頁。

using System;
using System.Web;
using System.Web.SessionState;

namespace QTJZ
{
    public class Filters : IHttpModule, IRequiresSessionState
    {
        public void Dispose() { }

        public void Init(HttpApplication application)
        {
            // 註冊 AcquireRequestState 事件:Session 狀態可用之後
            application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
        }

        public void application_AcquireRequestState(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            HttpRequest request = app.Request;
            HttpResponse response = app.Response;

            string url = request.CurrentExecutionFilePath.Trim('/');
            string suffix = request.CurrentExecutionFilePathExtension.Trim('.');

            // 過濾規則:非 Default.htm 且為 .aspx 或 .htm 則檢查 Session
            if (!url.Equals("Default.htm") && (suffix == "aspx" || suffix == "htm"))
            {
                object sessionObj = app.Context.Session == null ? null : app.Session["UserID"];
                if (sessionObj == null)
                {
                    response.Redirect("~/Default.htm");
                }
            }
        }
    }
}

HttpApplication 事件生命週期

事件觸發時機適用場景
BeginRequest管線開始,最早URL 重寫、請求記錄、防火牆
AuthenticateRequest身分識別建立後自訂驗證邏輯
AuthorizeRequest授權驗證後角色權限檢查
AcquireRequestState取得 Session 狀態後需存取 Session 的邏輯(本例)
PreRequestHandlerExecute處理器執行前頁面級初始化
PostRequestHandlerExecute處理器執行後輸出過濾、壓縮
ReleaseRequestState儲存 Session 狀態前Session 清理
EndRequest管線結束,最後回應記錄、清理資源

為何需要 IRequiresSessionState?

在 AcquireRequestState 事件中存取 app.Session 若未實作 IRequiresSessionState,會拋出「工作階段狀態在此內容中無法使用」例外。此介面標記模組需要 Session 支援,ASP.NET 會確保 Session 模組已初始化。

Web.config 註冊模組

<configuration>
  <system.web>
    <httpModules>
      <add name="filters" type="QTJZ.Filters" />
    </httpModules>
  </system.web>
  
  <!-- IIS 7+ 整合管線模式需同時註冊於 system.webServer -->
  <system.webServer>
    <modules>
      <add name="filters" type="QTJZ.Filters" preCondition="managedHandler" />
    </modules>
  </system.webServer>
</configuration>

現代替代方案建議

  • ASP.NET Core Middleware:app.Use(async (context, next) => { ... }) 取代 HttpModule
  • Authorization Filter / Policy:MVC/Web API 專用授權層,更細粒度、可測試
  • IdentityServer / OpenID Connect:企業級認證授權標準,支援 SSO、聯盟身分

本範例展示傳統 ASP.NET WebForms/HttpModule 架構。新專案請採用 ASP.NET Core Middleware 或成熟身分識別框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved