(五)創建Logon.ASPx頁面
1.在已創建好的項目裡創建一個新的Web 窗體,名為Logon.ASPx。
2.在編輯器裡打開Logon.ASPx,切換到Html視圖。
3.復制下面代碼,然後在編輯菜單裡“選擇粘貼為Html”選項,插入到<form>標簽之間。
1<h3>
2 <font face="Verdana">Logon Page</font>
3</h3>
4<table>
5 <tr>
6 <td>Email:</td>
7 <td><input id="txtUserName" type="text" runat="server"></td>
8 <td><ASP:RequiredFIEldValidator ControlToValidate="txtUserName"
9 Display="Static" ErrorMessage="*" runat="server"
10 ID="vUserName" /></td>
11 </tr>
12 <tr>
13 <td>PassWord:</td>
14 <td><input id="txtUserPass" type="passWord" runat="server"></td>
15 <td><ASP:RequiredFIEldValidator ControlToValidate="txtUserPass"
16 Display="Static" ErrorMessage="*" runat="server"
17 ID="vUserPass" />
18 </td>
19 </tr>
20 <tr>
21 <td>Persistent CookIE:</td>
22 <td><ASP:CheckBox id="chkPersistCookIE" runat="server" autopostback="false" /></td>
23 <td></td>
24 </tr>
25</table>
26<input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
27<ASP:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
28這個頁面用來顯示一個登錄表單以便用戶可以提供他們的用戶名和密碼,並且記錄到應用程序中。
4.切換到設計視圖,保存這個頁面。
(六)編寫事件處理代碼來驗證用戶身份
下面這些代碼是放在後置代碼頁裡的(Logon.ASPx.cs)
1.雙擊Logon頁面打開Logon.ASPx.cs文件。
2.在後置代碼文件裡導入必要的名空間:
using System.Data.SqlClIEnt;
using System.Web.Security;
3.創建一個ValidateUser的函數,通過在數據庫中查找用戶來驗證用戶的身份。(請改變數據庫連接字符串來指向你的數據庫)
1private bool ValidateUser( string userName, string passWord )
2{
3SqlConnection conn;
4SqlCommand cmd;
5string lookupPassWord = null;
6
7// Check for invalid userName.
8// userName must not be null and must be between 1 and 15 characters.
9if ( ( null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
10{
11 System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
12 return false;
13}
14
15// Check for invalid passWord.
16// passWord must not be null and must be between 1 and 25 characters.
17if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
18{
19 System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
20 return false;
21}
22
23try
24{
25 // Consult with your SQL Server administrator for an appropriate connection
26 // string to use to connect to your local SQL Server.
27 conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
28 conn.Open();
29
30 // Create SqlCommand to select pwd field from users table given supplIEd userName.
31 cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
32 cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
33 cmd.Parameters["@userName"].Value = userName;
34
35 // Execute command and fetch pwd fIEld into lookupPassWord string.
36 lookupPassWord = (string) cmd.ExecuteScalar();
37
38 // Cleanup command and connection objects.
39 cmd.Dispose();
40 conn.Dispose();
41}
42catch ( Exception ex )
43{
44 // Add error handling here for debugging.
45 // This error message should not be sent back to the caller.
46 System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
47}
48
49// If no passWord found, return false.
50if ( null == lookupPassWord )
51{
52 // You could write failed login attempts here to event log for additional security.
53 return false;
54}
55
56// Compare lookupPassword and input passWord, using a case-sensitive comparison.
57return ( 0 == string.Compare( lookupPassword, passWord, false ) );
58
59}
60
(注:這段代碼的意思是先判斷輸入的用戶名和密碼是否符合一定的條件,如上,如果符合則連接到數據庫,並且根據用戶名來取出密碼並返回密碼,最後再判斷取出的密碼是否為空,如果不為空則再判斷取出的密碼和輸入的密碼是否相同,最後的false參數為不區分大小寫)
4.在cmdLogin_ServerLick事件裡使用下面兩種方法中的一種來產生表單驗證的cookIE並將頁面轉到指定的頁面。
下面提供了兩種方法的示例代碼,根據你的需要來選擇。
a)在cmdLogin_ServerClick事件裡調用RedirectFromLoginPage方法來自動產生表單驗證cookIE且將頁面定向到一個指定的頁面。
private void cmdLogin_ServerClick(object sender,System.EventArgs e)
{
if(ValidateUser(txtUserName.value,txtUserPass.Value))
FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,chkPresistCookIE.Checked);
else
Response.Redirect("logon.ASPx",true);
}
b)產生加密驗證票據,創建回應的cookie,並且重定向用戶。這種方式給了更多的控制權去讓你如何去創建cookIE,你也可以連同FormsAuthenticationTicket一起包含一些自定義的數據。
1private void cmdLogin_ServerClick(object sender,System.EventArgs e)
2{
3 if(ValidateUser(txtUserName.value,txtUserPass.Value))
4 {
5 FormsAuthenticationTicket tkt;
6 string cookIEstr;
7 HttpCookIE ck;
8 tkt=new FormsAuthenticationTicket(1,txtUserName.value,DateTime.Now,DateTime.Now.AddMinutes(30),chkPersistCookIE.Checked,"your custom data"); //創建一個驗證票據
9 cookIEstr=FormsAuthentication.Encrypt(tkt);//並且加密票據
10 ck=new HttpCookie(FormsAuthentication.FormsCookieName,cookiestr);// 創建cookIE
11 if(chkpersistCookIE.Checked) //如果用戶選擇了保存密碼
12 ck.Expires=tkt.Expiratioin;//設置cookIE有效期
13 ck.Path=FormsAuthentication.FormsCookiePath;//cookIE存放路徑
14 Response.CookIEs.Add(ck);
15 string strRedirect;
16 strRedirect=Request["ReturnUrl"];
17 if(strRedirect==null)
18 strRedirect="default.ASPx";
19 Response.Redirect(strRedirect,true);
20 }
21 else
22 Reponse.Redirect("logon.ASPx",true);
23}
245.請確保在InititalizeComponent方法裡有如下代碼:
this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
(七)創建一個Default.ASPx頁面
這一節創建一個測試頁面用來作為當用戶驗證完之後重定向到的頁面。如果用戶第一次沒有被記錄下來就浏覽到這個頁,這時用戶將被重定向到登錄頁面。
1.把現有的WebForm1.aspx重命名為Default.ASPx,然後在編輯器裡打開。
2.切換到Html視圖,復制以下代碼到<form>標簽之間:
<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
這個按鈕用來注銷表單驗證會話。
3.切換到設計視圖,保存頁面。
4.在後置代碼裡導入必要的名空間:
using System.Web.Security;
5.雙擊SingOut按鈕打開後置代碼(Default.ASPx.cs),然後把下面代碼復制到cmdSingOut_ServerClick事件處理中:
private void cmdSignOut_ServerClick(object sender,System.EventArgs e)
{
FormsAuthentication.SignOut();//注銷
Response.Redirect("logon.ASPx",true);
}
6.請確認在InititalizeComponent方法中有以下代碼:
this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
7.保存編譯項目,現在可以運行這個應用程序了。
(八)附加提示
1.如果想要在數據庫裡安全地存放密碼,可以在存放到數據到之前先用FormsAuthentication類裡的HashPassWordForStoringInConfigFile函數來加密。(注:將會產生一個哈希密碼)
2.可以在配置文件(Web.config)裡存放SQL連接信息,以便當需要時方便修改。
3.可以增加一些代碼來防止黑客使用窮舉法來進行登錄。例如,增加一些邏輯使用戶只能有兩三次的登錄機會。如果用戶在指定的登錄次數裡無法登錄的話,可以在數據庫裡設置一個標志符來防止用戶登錄直到此用戶訪問另一個頁面或者請示你的幫助。另外,也可以在需要時增加一些適當的錯誤處理。
4.因為用戶是基於驗證cookie來識別的,所以可以在應用程序裡使用安全套接層(SSL)來保護驗證cookIE和其它有用的信息。
5.基於表單的驗證方式要求客戶端的游覽器接受或者啟用cookIEs.
6.在<authentication>配置節裡的timeout參數用來控制驗證cookIEs重新產生的間隔時間。可以給它賦一個適當的值來提供更好的性能和安全性。
7.在Internet上的一些代理服務器或者緩沖可能會緩存一些將會重新返回給另外一個用戶的包含Set-Cookie頭的Web服務器響應。因為基於表單的驗證是使用cookIE來驗證用戶的,所以通過中間代理服務器或者緩沖的話可能會引起用戶會被意外地搞錯為原本不是要發送給他的用戶。
參考文章:
如果想要知道如何通過配置<credentials>節點存放用戶名和密碼來實現基於表單的驗證的話,請參考以下GotDotNet ASP.Net QuickStart示例:
基於表單的驗證:http://www.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.ASPx
如果想要知道如何使用XML文件來存放用戶名和密碼來實現基於表單的驗證的話,請參考SDK文檔的以下示例:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpguide/Html/cpconcookIEauthenticationusinganXMLusersfile.ASP
如果想要知道更多的關於ASP.NET安全的話,請參考Microsoft .Net Framework Developer's Guide文檔:
ASP.Net 安全: http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpguide/Html/cpconaspnetwebapplicationsecurity.ASP
如果想知道更多關於System.Web.Security名空間的話,請參考:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpref/Html/frlrfSystemWebSecurity.ASP
如果想知道更多的關於ASP.NET配置的話,請參考Microsoft .Net Framework Developer's Guide文檔:
ASP.Net配置:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpguide/Html/cpconaspnetconfiguration.ASP
ASP.Net配置節點:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/cpguide/Html/cpgrfaspnetconfigurationsections.ASP
如果想知道更多關於ASP.Net安全指導的話,請參考MSDN:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/dnbda/Html/authaspdotnet.ASP
如果想知道更多關於ASP.Net的,請參考MSDN新聞組:
http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409
這篇文章適用於:
Microsoft ASP.NET (included with the .Net Framework 1.1)
Microsoft Visual C# .Net (2003)
Microsoft ASP.NET (included with the .Net Framework) 1.0
Microsoft Visual C# .Net (2002)
Microsoft SQL Server 2000 (all editions)
Microsoft SQL Server 7.0
Microsoft SQL Server 2000 64 bit (all editions)