ASP.NET Forms 驗證允許使用者透過網頁表單輸入帳密進行身分驗證。本文完整示範如何在 SQL Server 2000 中安全儲存使用者憑證(SHA1 雜湊 + Salt),建立登入頁面、設定 Web.config、開發雜湊工具函數、建立使用者資料表與預存程序,打造完整的表單驗證方案。
Visual Studio .NET → 新增 Visual C# ASP.NET Web 應用程式 FormsAuthSQL → 重命名 WebForm1.aspx 為 Logon.aspx → 加入控制項:
| 控制項 | 文字 | ID |
|---|---|---|
| Label | User Name: | - |
| Label | Password: | - |
| TextBox | - | txtUserName |
| TextBox (TextMode=Password) | - | txtPassword |
| Button | Register | btnRegister |
| Button | Logon | btnLogon |
| Label | - | lblMessage |
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/" />
</authentication>
<authorization>
<deny users="?" /> <!-- 拒絕匿名用戶 -->
</authorization>
</system.web>
</configuration>
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");
}
-- 在 Query Analyzer 執行
CREATE DATABASE UserAccounts;
GO
USE UserAccounts;
GO
CREATE TABLE Users (
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserName NVARCHAR(50) NOT NULL UNIQUE,
PasswordHash NVARCHAR(100) NOT NULL,
Salt NVARCHAR(50) NOT NULL,
PasswordHint NVARCHAR(100) NULL
);
GO
CREATE PROCEDURE sp_RegisterUser
@UserName NVARCHAR(50),
@Password NVARCHAR(50),
@Hint NVARCHAR(100)
AS
BEGIN
DECLARE @Salt NVARCHAR(50) = dbo.fn_CreateSalt(8); -- 需建立對應函數或應用層產生
DECLARE @Hash NVARCHAR(100) = dbo.fn_CreateHash(@Password, @Salt);
INSERT INTO Users (UserName, PasswordHash, Salt, PasswordHint)
VALUES (@UserName, @Hash, @Salt, @Hint);
END;
GO
CREATE PROCEDURE sp_ValidateUser
@UserName NVARCHAR(50),
@Password NVARCHAR(50)
AS
BEGIN
DECLARE @Salt NVARCHAR(50), @Hash NVARCHAR(100);
SELECT @Salt = Salt, @Hash = PasswordHash FROM Users WHERE UserName = @UserName;
IF @Hash IS NOT NULL AND @Hash = dbo.fn_CreateHash(@Password, @Salt)
SELECT 1 AS Valid; -- 成功
ELSE
SELECT 0 AS Valid; -- 失敗
END;
GO
PBKDF2、bcrypt 或 Argon2(需 CLR 整合或應用層運算),SHA1 已不建議用於新系統密碼雜湊。protected void btnLogon_Click(object sender, EventArgs e)
{
string user = txtUserName.Text.Trim();
string pwd = txtPassword.Text;
// 輸入驗證(防 SQL Injection)
if (!Regex.IsMatch(user, @"^[\w@.-]{1,50}$")) {
lblMessage.Text = "帳號格式錯誤";
return;
}
// 呼叫預存程序驗證
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlCommand cmd = new SqlCommand("sp_ValidateUser", conn)) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserName", user);
cmd.Parameters.AddWithValue("@Password", pwd);
conn.Open();
int valid = (int)cmd.ExecuteScalar();
if (valid == 1) {
FormsAuthentication.RedirectFromLoginPage(user, false);
} else {
lblMessage.Text = "帳號或密碼錯誤";
}
}
}
authentication mode="Forms" 且 deny users="?"。TextMode="Password",傳輸採 HTTPS。遵循「雜湊 + Salt + 參數化 + HTTPS」四大原則,即可建立相對安全的 Forms 驗證系統,保護使用者憑證不外洩。