Forms 驗證是 ASP.NET 最彈性、最常用的驗證模式。本文解析其基於 Cookie 的運作流程、核心 API (FormsAuthenticationModule、FormsAuthentication、FormsIdentity、FormsAuthenticationTicket) 以及從匿名請求到驗證通過的完整生命週期。
Default.aspx)。loginUrl (Login.aspx),並保存原始 URL 於 ReturnUrl 參數。FormsAuthenticationTicket (含使用者名、UserData、到期時間) → FormsAuthentication.Encrypt 加密 → 寫入 Cookie → 發送瀏覽器。Default.aspx)。FormsAuthenticationModule 在 AuthenticateRequest 解密 Cookie、驗證 MAC、還原 Ticket → 建立 FormsIdentity + GenericPrincipal → 指派 Context.User。Context.User 檢查權限 → 允許存取。| 類別 | 命名空間 | 職責 |
|---|---|---|
| FormsAuthenticationModule | System.Web.Security | HTTP 模組,掛接 AuthenticateRequest,自動解密 Cookie 建立 Principal |
| FormsAuthentication | System.Web.Security | 靜態輔助類:RedirectFromLoginPage、SetAuthCookie、Encrypt/Decrypt、SignOut、GetAuthCookie |
| FormsIdentity | System.Web.Security | 實作 IIdentity,屬性 Ticket 取得原始 Ticket |
| FormsAuthenticationTicket | System.Web.Security | 資料容器:Name、UserData、Expiration、IsPersistent 等 |
// 簡易登入:自動建立 Ticket、加密、寫入 Cookie、重導
FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie: true);
// 手動控制 Ticket 內容
var ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now,
DateTime.Now.AddHours(2), true, "UserId=123|Role=Admin", "/");
string enc = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, enc));
// 登出
FormsAuthentication.SignOut();
User -> Browser: GET /Default.aspx Browser -> IIS: Request IIS -> ASP.NET Pipeline: BeginRequest Pipeline -> UrlAuthModule: AuthorizeRequest -> 401 Unauthorized Pipeline -> Response: 302 Redirect /Login.aspx?ReturnUrl=/Default.aspx Browser -> User: Show Login Form User -> Browser: POST /Login.aspx (credentials) Browser -> Pipeline: AuthenticateRequest (FormsAuthModule: no cookie yet) Pipeline -> Login.aspx: Page_Load -> btnLogin_Click Login.aspx -> AuthHelper: ValidateUser -> success Login.aspx -> FormsAuth: Create Ticket, Encrypt, Set Cookie Login.aspx -> Response: 302 Redirect /Default.aspx Browser -> Pipeline: AuthenticateRequest (FormsAuthModule: decrypt cookie -> Principal) Pipeline -> UrlAuthModule: AuthorizeRequest -> Allow Pipeline -> Default.aspx: Page Lifecycle -> Render Browser -> User: Show Protected Page
FormsAuthenticationModule 是自動化關鍵,手動建立 Cookie 仍需該模組解析。machineKey 決定加密/驗證金鑰,Web Farm 必須同步。