建立一個 ASP.NET Web 應用程式,使用 Forms 驗證機制,將使用者憑證 (雜湊後) 安全儲存於 SQL Server 2000,並實作註冊與登入功能。
RNGCryptoServiceProvider) 產生。FormsAuthSQL。WebForm1.aspx 重命名為 Logon.aspx。txtUserName、txtPassword (TextMode=Password)、btnRegister、btnLogon、lblMessage。<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/" />
</authentication>
<authorization>
<deny users="?" /> <!-- 拒絕匿名使用者 -->
</authorization>
</system.web>
</configuration>
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");
}
使用 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']
// 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();
}
}
LookupUser 預存程序取得該使用者的 PasswordHash 與 Salt。CreatePasswordHash(inputPwd, salt)。FormsAuthentication.RedirectFromLoginPage(userName, false) 導向原請求頁面。Web.config <connectionStrings> 區段並加密。