萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

ASP.NET 2.0 結合 SQL Server 2000 實作 Forms 身份驗證完整範例

專案目標

建立一個 ASP.NET Web 應用程式,使用 Forms 驗證機制,將使用者憑證 (雜湊後) 安全儲存於 SQL Server 2000,並實作註冊與登入功能。

核心安全設計原則

  • 儲存密碼雜湊而非明文: 使用 SHA1 演算法搭配 Salt (隨機鹽值) 產生單向雜湊,避免金鑰管理困擾。
  • 防禦字典攻擊: Salt 值使用密碼學亂數產生器 (RNGCryptoServiceProvider) 產生。
  • 密碼遺失不可回復: 應提供密碼提示功能並儲存於資料庫。
  • 輸入驗證防 SQL Injection: 所有使用者輸入傳遞給 SQL 前必須嚴格驗證,登入邏輯更是重中之重。

實作步驟總覽

1. 建立 Web 專案與登入頁面

  • Visual Studio .NET 建立 Visual C# ASP.NET Web 專案 FormsAuthSQL。
  • 將 WebForm1.aspx 重命名為 Logon.aspx。
  • 佈置控制項:txtUserName、txtPassword (TextMode=Password)、btnRegister、btnLogon、lblMessage。

2. 設定 Web.config 啟用 Forms 驗證

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/" />
    </authentication>
    <authorization>
      <deny users="?" /> <!-- 拒絕匿名使用者 -->
    </authorization>
  </system.web>
</configuration>

3. 撰寫雜湊與 Salt 產生工具類別 (Logon.aspx.cs)

using System.Security.Cryptography;
using System.Web.Security;

private static string CreateSalt(int size)
{
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);
    return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);
    return FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "SHA1");
}

4. 建立使用者帳號資料庫 (UserAccounts)

使用 Query Analyzer 執行腳本:

USE master
GO
IF EXISTS (SELECT * FROM sysdatabases WHERE name = 'UserAccounts')
    DROP DATABASE UserAccounts
GO
CREATE DATABASE UserAccounts
GO
USE UserAccounts
GO

CREATE TABLE [Users] (
    [UserName] [varchar] (255) NOT NULL,
    [PasswordHash] [varchar] (40) NOT NULL,
    [Salt] [varchar] (10) NOT NULL,
    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserName]) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE PROCEDURE RegisterUser
    @userName varchar(255), @passwordHash varchar(40), @salt varchar(10)
AS
    INSERT INTO Users VALUES (@userName, @passwordHash, @salt)
GO

CREATE PROCEDURE LookupUser
    @userName varchar(255)
AS
    SELECT PasswordHash, Salt FROM Users WHERE UserName = @userName
GO

-- 授權 ASPNET 帳號存取 (請將 LocalMachine 替換為實際電腦名稱)
EXEC sp_grantlogin ['LocalMachine\ASPNET']
EXEC sp_grantdbaccess ['LocalMachine\ASPNET']
GRANT EXECUTE ON LookupUser TO ['LocalMachine\ASPNET']
GRANT EXECUTE ON RegisterUser TO ['LocalMachine\ASPNET']

5. 實作註冊按鈕事件與 ADO.NET 存取邏輯

// btnRegister_Click 事件
string salt = CreateSalt(5);
string passwordHash = CreatePasswordHash(txtPassword.Text, salt);

try {
    StoreAccountDetails(txtUserName.Text, passwordHash, salt);
    lblMessage.Text = "註冊成功!";
} catch (Exception ex) {
    lblMessage.Text = ex.Message;
}

// ADO.NET 儲存方法
private void StoreAccountDetails(string userName, string passwordHash, string salt)
{
    string connStr = "Server=localhost;Database=UserAccounts;Integrated Security=SSPI;";
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand("RegisterUser", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@userName", SqlDbType.VarChar, 255).Value = userName;
        cmd.Parameters.Add("@passwordHash", SqlDbType.VarChar, 40).Value = passwordHash;
        cmd.Parameters.Add("@salt", SqlDbType.VarChar, 10).Value = salt;
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}

登入驗證邏輯 (btnLogon_Click)

  1. 呼叫 LookupUser 預存程序取得該使用者的 PasswordHash 與 Salt。
  2. 使用相同演算法計算輸入密碼的雜湊:CreatePasswordHash(inputPwd, salt)。
  3. 比對計算出的雜湊與資料庫儲存的雜湊是否相符。
  4. 相符則 FormsAuthentication.RedirectFromLoginPage(userName, false) 導向原請求頁面。

部署注意事項

  • 連線字串建議放在 Web.config <connectionStrings> 區段並加密。
  • 生產環境務必使用 TLS (SSL) 加密傳輸登入表單。
  • 考慮升級雜湊演算法至 PBKDF2、bcrypt 或 Argon2 (需 .NET Framework 4.6+ / .NET Core)。
copyright © 萬盛學電腦網 all rights reserved