摘要 ASP.NET Forms 身份驗(yàn)證允許用戶將憑據(jù)(用戶名和密碼)輸入到 Web Form 來標(biāo)識其身份。在收到這些憑據(jù)時(shí),Web 應(yīng)用程序可以根據(jù)數(shù)據(jù)源來檢查這些憑據(jù),從而對用戶進(jìn)行身份驗(yàn)證。 本模塊描述如何使用密碼哈希安全地將用戶憑據(jù)存儲在 SQL Server 中,以及
摘要
ASP.NET Forms 身份驗(yàn)證允許用戶將憑據(jù)(用戶名和密碼)輸入到 Web Form 來標(biāo)識其身份。在收到這些憑據(jù)時(shí),Web 應(yīng)用程序可以根據(jù)數(shù)據(jù)源來檢查這些憑據(jù),從而對用戶進(jìn)行身份驗(yàn)證。
本模塊描述如何使用密碼哈希安全地將用戶憑據(jù)存儲在 SQL Server 中,以及如何根據(jù)包含在 SQL Server 中的帳戶數(shù)據(jù)庫對用戶進(jìn)行身份驗(yàn)證。
預(yù)備知識
安全地存儲用戶憑據(jù)包含兩個(gè)關(guān)鍵概念:
• 存儲密碼摘要。出于安全性考慮,請不要將密碼明文存儲在數(shù)據(jù)庫中。本模塊描述如何創(chuàng)建和存儲用戶密碼的單向哈希而非密碼本身。如果要存儲加密的用戶密碼,建議選擇這種方法,,因?yàn)樗苊饬伺c加密技術(shù)相關(guān)的密鑰管理問題。
為增加安全性并減輕與字典攻擊相關(guān)的威脅,本模塊中描述的方法在創(chuàng)建密碼哈希前,將 salt(以加密方式生成的隨機(jī)數(shù))與密碼結(jié)合起來。
• 重要事項(xiàng) 不將密碼存儲在數(shù)據(jù)庫中的一個(gè)缺點(diǎn)是,一旦用戶忘記密碼,則無法恢復(fù)。因而,應(yīng)用程序應(yīng)使用密碼提示,并將它們與密碼摘要一起存儲在數(shù)據(jù)庫中。
• 驗(yàn)證用戶輸入。當(dāng)將用戶輸入傳遞給 SQL 命令時(shí),例如比較語句或模式匹配語句中的字符串,應(yīng)非常小心地驗(yàn)證此輸入,以確保最終的命令不包含語法錯(cuò)誤,并且還要確保黑客不會使您的應(yīng)用程序運(yùn)行任意 SQL 命令。在登錄過程中驗(yàn)證提供的用戶名特別重要,因?yàn)閼?yīng)用程序的安全模型完全取決于是否能夠正確而安全地對用戶進(jìn)行身份驗(yàn)證。
創(chuàng)建一個(gè)有登錄頁的 Web 應(yīng)用程序
此過程創(chuàng)建一個(gè)簡單的 Visual C# Web 應(yīng)用程序,它包含一個(gè)用戶可以輸入用戶名和密碼的登錄頁。
要創(chuàng)建一個(gè)有登錄頁的 Web 應(yīng)用程序,請執(zhí)行下列步驟:
• 啟動 Visual Studio .NET 并創(chuàng)建一個(gè)新的名為 FormsAuthSQL 的 Visual C# ASP.NET Web 應(yīng)用程序。
• 使用解決方案資源管理器將 WebForm1.aspx 重命名為 Logon.aspx
• 將表 1 中列出的控件添加到 Logon.aspx 中來創(chuàng)建簡單的登錄窗體。
表 1:Logon.aspx 控件控件類型文本ID
Label
User Name:
-
Label
Password
-
Text Box
-
txtUserName
Text Box
-
txtPassword
Button
Register
btnRegister
Button
Logon
btnLogon
Label
-
lblMessage
您的 Web 頁應(yīng)與圖 1 中所示的頁類似。
圖 1. 登錄頁 Web 窗體
• 將 txtPassword 的 TextMode 屬性設(shè)置為 Password。
配置 Web 應(yīng)用程序進(jìn)行 Forms 身份驗(yàn)證
此過程編輯應(yīng)用程序的 Web.config 文件來配置應(yīng)用程序以進(jìn)行 Forms 身份驗(yàn)證。
要配置 Web 應(yīng)用程序以進(jìn)行 Forms 身份驗(yàn)證,請執(zhí)行下列步驟:
1. 使用解決方案資源管理器打開 Web.config。
2. 定位到 元素并將 mode 屬性更改為 Forms。
3. 將下列 元素作為 元素的子元素進(jìn)行添加,并設(shè)置 loginUrl、name、timeout 和 path 屬性,如下所示:
ms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/">
4. 將下列 元素添加到 元素下這一步的目的是只允許經(jīng)過身份驗(yàn)證的用戶訪問應(yīng)用程序。以前建立的 元素的 loginUrl 屬性將未經(jīng)過身份驗(yàn)證的請求重定向到 logon.aspx 頁。
開發(fā)生成哈希和 Salt 值的函數(shù)
此過程向 Web 應(yīng)用程序添加兩個(gè)實(shí)用工具方法;一個(gè)方法生成一個(gè)隨機(jī) salt 值,另一個(gè)方法根據(jù)提供的密碼和 salt 值創(chuàng)建哈希。
要開發(fā)生成哈希和 salt 值的函數(shù),請執(zhí)行下列步驟:
1. 打開 Logon.aspx.cs 并將下列 using 語句添加到位于文件頂部的現(xiàn)有 using 語句下。
using System.Security.Cryptography;
using System.Web.Security;
2. 將下列靜態(tài)方法添加到 WebForm1 類中,用于生成隨機(jī) salt 值并作為 Base 編碼字符串返回此值。
private static string CreateSalt(int size)
{
// Generate a cryptographic random number using the cryptographic
// service provider
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] buff = new byte[size];
rng.GetBytes(buff);
// Return a Base string representation of the random number
return Convert.ToBaseString(buff);
}
3. 添加下列靜態(tài)方法以根據(jù)提供的密碼和 salt 值生成哈希值。
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd =
FormsAuthentication.HashPasswordForStoringInConfigFile(
saltAndPwd, "SHA1");
return hashedPwd;
}
創(chuàng)建用戶帳戶數(shù)據(jù)庫
此過程在 SQL Server 中創(chuàng)建一個(gè)新的用戶帳戶數(shù)據(jù)庫,此數(shù)據(jù)庫包含一個(gè)用戶表和一個(gè)用于查詢用戶數(shù)據(jù)庫的存儲過程。
要創(chuàng)建用戶帳戶數(shù)據(jù)庫,請執(zhí)行下列操作:
1. 在 Microsoft SQL Server programs 菜單上,單擊 Query Analyzer,然后連接到本地 SQL Server。
2. 輸入下列 SQL 腳本。注意,必須用自己的計(jì)算機(jī)名稱替換此腳本末尾的“LocalMachine”。
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號-2
違法及侵權(quán)請聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬商天勤律師事務(wù)所王興未律師提供法律服務(wù)