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

ASP.NET Forms 認證實戰(二):登入頁面實作、驗證邏輯、票據管理與登出機制

     編輯:關於C語言

步驟 5:建立 Logon.aspx 登入頁面

標記語法

<h3><font face="Verdana">Logon Page</font></h3>
<table>
  <tr>
    <td>Email:</td>
    <td><input id="txtUserName" type="text" runat="server" /></td>
    <td><asp:RequiredFieldValidator ControlToValidate="txtUserName" 
         Display="Static" ErrorMessage="*" runat="server" ID="vUserName" /></td>
  </tr>
  <tr>
    <td>Password:</td>
    <td><input id="txtUserPass" type="password" runat="server" /></td>
    <td><asp:RequiredFieldValidator ControlToValidate="txtUserPass" 
         Display="Static" ErrorMessage="*" runat="server" ID="vUserPass" /></td>
  </tr>
  <tr>
    <td>Persistent Cookie:</td>
    <td><asp:CheckBox id="chkPersistCookie" runat="server" AutoPostBack="false" /></td>
    <td></td>
  </tr>
</table>
<input type="submit" Value="Logon" runat="server" ID="cmdLogin">
<asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />

步驟 6:後置程式碼驗證邏輯

命名空間匯入

using System.Data.SqlClient;
using System.Web.Security;

ValidateUser 方法:資料庫驗證核心

private bool ValidateUser(string userName, string passWord) {
    // 輸入驗證
    if (string.IsNullOrEmpty(userName) || userName.Length > 15) return false;
    if (string.IsNullOrEmpty(passWord) || passWord.Length > 25) return false;

    string lookupPassword = null;
    try {
        using (var conn = new SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")) {
            conn.Open();
            using (var cmd = new SqlCommand("SELECT Pwd FROM Users WHERE uname = @userName", conn)) {
                cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25).Value = userName;
                lookupPassword = (string)cmd.ExecuteScalar();
            }
        }
    } catch (Exception ex) {
        System.Diagnostics.Trace.WriteLine($"[ValidateUser] Exception: {ex.Message}");
        return false;
    }

    if (lookupPassword == null) return false;
    // 區分大小寫比對
    return string.Compare(lookupPassword, passWord, false) == 0;
}

關鍵點:

  • 參數化查詢防 SQL Injection
  • using 確保連線釋放
  • ExecuteScalar 單值查詢效能最佳
  • 區分大小寫比對(false 參數)

步驟 7:登入按鈕事件處理 - 兩種票據建立方式

方式 A:簡易 RedirectFromLoginPage(自動處理 Cookie 與導向)

private void cmdLogin_ServerClick(object sender, EventArgs e) {
    if (ValidateUser(txtUserName.Value, txtUserPass.Value)) {
        FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked);
    } else {
        Response.Redirect("Logon.aspx", true);
    }
}

方式 B:手動建立票據與 Cookie(完全控制)

private void cmdLogin_ServerClick(object sender, EventArgs e) {
    if (ValidateUser(txtUserName.Value, txtUserPass.Value)) {
        var ticket = new FormsAuthenticationTicket(
            1, txtUserName.Value, DateTime.Now, 
            DateTime.Now.AddMinutes(30), 
            chkPersistCookie.Checked, 
            "custom user data"  // 可攜帶角色等自訂資料
        );
        string encTicket = FormsAuthentication.Encrypt(ticket);
        var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
        if (chkPersistCookie.Checked) cookie.Expires = ticket.Expiration;
        cookie.Path = FormsAuthentication.FormsCookiePath;
        Response.Cookies.Add(cookie);

        string redirectUrl = Request["ReturnUrl"] ?? "Default.aspx";
        Response.Redirect(redirectUrl, true);
    } else {
        Response.Redirect("Logon.aspx", true);
    }
}

方式 B 優勢:可在票據 UserData 嵌入角色、權限、使用者 ID 等,避免每次請求查詢資料庫。

事件繫結確認

this.cmdLogin.ServerClick += new EventHandler(this.cmdLogin_ServerClick);

步驟 8:建立 Default.aspx 測試頁與登出功能

標記

<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">

後置程式碼

using System.Web.Security;

private void cmdSignOut_ServerClick(object sender, EventArgs e) {
    FormsAuthentication.SignOut(); // 清除認證 Cookie
    Response.Redirect("Logon.aspx", true);
}

this.cmdSignOut.ServerClick += new EventHandler(this.cmdSignOut_ServerClick);

步驟 9:建置與測試

  1. 建置專案
  2. 瀏覽 Default.aspx → 應導向 Logon.aspx
  3. 輸入 user1/user1 → 登入成功導向 Default.aspx
  4. 點擊 SignOut → 導向登入頁,再次訪問 Default.aspx 應再次導向登入

進階提示與最佳實踐

  1. 密碼雜湊:儲存前用 FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "SHA1")(或更強演算法)
  2. 連接字串組態化:<connectionStrings> + ConfigurationManager.ConnectionStrings
  3. 暴力破解防護:失敗計數、帳號暫時鎖定、IP 限流
  4. HTTPS:<forms requireSSL="true" /> 強制加密傳輸
  5. Cookie 保護:protection="All"(驗證+加密),HttpOnly、Secure 標記
  6. Proxy 快取風險:設定 Cache-Control: no-cache 避免認證 Cookie 被快取

表單認證雖為經典機制,但在 ASP.NET Core 時代已演進為 Cookie 認證中介軟體。理解其核心原理(票據、Cookie、滑動過期、資料保護),有助於在現代架構中正確配置認證流程。

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