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

ASP.NET 生命週期中的驗證與授權模組深度解析

     編輯:關於ASP.NET

每個 ASP.NET 請求都會經歷完整生命週期,驗證與授權發生在特定管線事件。本文詳細說明請求從 IIS → ISAPI → ASP.NET 管線 → 頁面生命週期的流程,並聚焦 Application_AuthenticateRequest、Application_AuthorizeRequest 兩大關鍵事件與對應 HTTP 模組。

請求處理完整流程

  1. 用戶端發送 HTTP 請求。
  2. IIS 接收,依副檔名對應 ISAPI 擴展 (aspnet_isapi.dll)。
  3. ISAPI 將請求遞送至 ASP.NET Worker Process (w3wp.exe)。
  4. ASP.NET 管線啟動:HttpRuntime → HttpApplication 建立/取自池。
  5. 管線事件依序觸發:
     BeginRequest → AuthenticateRequest → **AuthorizeRequest** → ResolveRequestCache → AcquireRequestState → PreRequestHandlerExecute → Handler 執行 (頁面/Web Service) → PostRequestHandlerExecute → ReleaseRequestState → UpdateRequestCache → EndRequest。
  6. 若為 .aspx,進入頁面生命週期 (Init、Load、Render 等)。

ASP.NET 請求管線與驗證授權事件位置

驗證模組

  • 觸發點:Application_AuthenticateRequest (對應 AuthenticateRequest 事件)。
  • 內建模組:FormsAuthenticationModule、WindowsAuthenticationModule、PassportAuthenticationModule、DefaultAuthenticationModule (匿名身分)。
  • 運作:解析請求憑證 → 建立 IIdentity → 包裝 IPrincipal → 指派 Context.User。
  • 自訂:實作 IHttpModule,在 Init 掛接 context.AuthenticateRequest += ...。

授權模組

  • 觸發點:Application_AuthorizeRequest (對應 AuthorizeRequest 事件)。
  • 內建模組:UrlAuthorizationModule (URL 授權)、FileAuthorizationModule (檔案授權)。
  • URL 授權規則 (web.config):
    <authorization>
     <allow roles="Admin" />
     <deny users="?" /> <!-- 匿名 -->
    </authorization>

    規則由上往下匹配,首個匹配生效。
  • 檔案授權:僅 Windows 驗證生效,檢查要求檔案 NTFS ACL 是否允許 Context.User.Identity 存取。

自訂驗證/授權模組範例


public class CustomAuthModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.AuthenticateRequest += OnAuthenticate;
        app.AuthorizeRequest += OnAuthorize;
    }

    private void OnAuthenticate(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        // 從自訂 Header 讀取 Token
        string token = app.Request.Headers["X-Auth-Token"];
        if (!string.IsNullOrEmpty(token))
        {
            var principal = TokenService.Validate(token); // 回傳 IPrincipal
            if (principal != null)
            {
                app.Context.User = principal;
                Thread.CurrentPrincipal = principal;
            }
        }
    }

    private void OnAuthorize(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        // 進一步細粒度授權邏輯
        if (app.Context.Request.Path.StartsWith("/api/admin") &&
            !app.Context.User.IsInRole("Admin"))
        {
            app.Context.Response.StatusCode = 403;
            app.CompleteRequest(); // 短路管線
        }
    }

    public void Dispose() { }
}

註冊模組 (IIS 7+ 整合模式)


<system.webServer>
  <modules>
    <add name="CustomAuthModule" type="MyNamespace.CustomAuthModule, MyAssembly" preCondition="integratedMode" />
  </modules>
</system.webServer>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved