如何使用 C# .NET 在 ASP.NET 應用程序中實現基於窗體的身份驗證

做者:微軟 本文的發佈號曾爲 CHS301240 有關本文的 Microsoft Visual Basic .NET 版本,請參閱 308157。 在 Web.config 文件中配置安全設置 本節介紹如何添加和修改 authentication 和 authorization 配置部分,以便將 ASP.NET 應用程序配置爲使用基於窗體的身份驗證。 1. 在項目資源管理器中,打開 Web.config 文件。 2. 將身份驗證模式更改成Forms (窗體)。 3. 插入 Forms 標記,並填入相應的屬性。(有關這些屬性的更多信息,請參閱 參考 一節中列出的 MSDN 文檔或快速入門文檔。)複製如下代碼,而後單擊編輯菜單上的粘貼爲 HTML,以粘貼文件 authentication 部分中的代碼: authentication mode=Forms forms name=.ASPXFORMSDEMO loginUrl=logon.aspx protection=All path=/ timeout=30 / /authentication 4. 在 authorization 部分中拒絕匿名用戶的訪問(以下所示): authorization deny users =? / allow users = * / /authorization 返回頁首 建立示例數據庫表以存儲用戶詳細信息 本節介紹如何建立可存儲用戶名、密碼和用戶角色的示例數據庫。若是要將用戶角色存儲在數據庫中並實現基於角色的安全性,則須要角色列。 1. 在開始菜單上,單擊運行,而後鍵入 notepad 以打開記事本。 2. 突出顯示如下 SQL 腳本代碼,右鍵單擊該代碼,而後單擊複製。在記事本中,單擊編輯菜單上的粘貼以粘貼如下代碼: if exists (select * from sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Users] GO CREATE TABLE [dbo].[Users] ( [uname] [varchar] (15) NOT NULL , [Pwd] [varchar] (25) NOT NULL , [userRole] [varchar] (25) NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Users] WITH NOCHECK ADD CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED ( [uname] ) ON [PRIMARY] GO INSERT INTO Users values('user1','user1','Manager') INSERT INTO Users values('user2','user2','Admin') INSERT INTO Users values('user3','user3','User') GO 3. 將該文件另存爲 Users.sql。 4. 在 Microsoft SQL Server 計算機上,在查詢分析器中打開 Users.sql。在數據庫列表中,單擊pubs,而後運行該腳本。這將建立一個示例用戶表,並使用此示例應用程序填充要使用的 Pubs 數據庫中的該表。 返回頁首 建立 Logon.aspx 頁 1. 將一個新的 Web 窗體添加到名爲 Logon.aspx 的項目中。 2. 在編輯器中打開 Logon.aspx 頁,並切換到 HTML 視圖。 3. 複製如下代碼,而後使用編輯菜單上的粘貼爲 HTML選項將代碼插入到 form 標記之間: h3 font face=VerdanaLogon Page/font /h3 table tr tdEmail:/td tdinput id=txtUserName type=text runat=server/td tdASP:RequiredFieldValidator ControlToValidate=txtUserName Display=Static ErrorMessage=* runat=server ID=vUserName //td /tr tr tdPassword:/td tdinput id=txtUserPass type=password runat=server/td tdASP:RequiredFieldValidator ControlToValidate=txtUserPass Display=Static ErrorMessage=* runat=server ID=vUserPass / /td /tr tr tdPersistent Cookie:/td tdASP:CheckBox id=chkPersistCookie runat=server autopostback=false //td td/td /tr /table input type=submit Value=Logon runat=server ID=cmdLoginp/p asp:Label id=lblMsg ForeColor=red Font-Name=Verdana Font-Size=10 runat=server / 此 Web 窗體用於向用戶提供登陸窗體,以便他們提供用於登陸到應用程序的用戶名和密碼。 4. 切換到設計視圖並保存該頁。 返回頁首 對事件處理程序進行編碼以使它驗證用戶憑據 本節給出位於代碼隱藏頁 (Logon.aspx.cs) 中的代碼。 1. 雙擊Logon打開 Logon.aspx.cs 文件。 2. 導入代碼隱藏文件中必需的命名空間: using System.Data.SqlClient; using System.Web.Security; 3. 建立 ValidateUser 函數,以便經過查找數據庫來驗證用戶憑據。(確保將鏈接字符串更改成指向數據庫。) private bool ValidateUser( string userName, string passWord ) { SqlConnection conn; SqlCommand cmd; string lookupPassword = null; // Check for invalid userName. // userName must not be null and must be between 1 and 15 characters. if ( ( null == userName ) || ( 0 == userName.Length ) || ( userName.Length 15 ) ) { System.Diagnostics.Trace.WriteLine( [ValidateUser] Input validation of userName failed. ); return false; } // Check for invalid passWord. // passWord must not be null and must be between 1 and 25 characters. if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length 25 ) ) { System.Diagnostics.Trace.WriteLine( [ValidateUser] Input validation of passWord failed. ); return false; } try { // Consult with your SQL Server administrator for an appropriate connection // string to use to connect to your local SQL Server. conn = new SqlConnection( server=localhost;Integrated Security=SSPI;database=pubs ); conn.Open(); // Create SqlCommand to select pwd field from users table given supplied userName. cmd = new SqlCommand( Select pwd from users where uname=@userName, conn ); cmd.Parameters.Add( @userName, SqlDbType.VarChar, 25 ); cmd.Parameters[@userName].Value = userName; // Execute command and fetch pwd field into lookupPassword string. lookupPassword = (string) cmd.ExecuteScalar(); // Cleanup command and connection objects. cmd.Dispose(); conn.Dispose(); } catch ( Exception ex ) { // Add error handling here for debugging. // This error message should not be sent back to the caller. System.Diagnostics.Trace.WriteLine( [ValidateUser] Exception + ex.Message ); } // If no password found, return false. if ( null == lookupPassword ) { // You could write failed login attempts here to event log for additional security. return false; } // Compare lookupPassword and input passWord, using a case-sensitive comparison. return ( 0 == string.Compare( lookupPassword, passWord, false ) ); } 4. 可以使用兩種方法之一輩子成窗體身份驗證 Cookie,並將用戶重定向到 cmdLogin_ServerClick 事件中的相應頁。爲兩種情形都提供了示例代碼。可根據須要使用其中的一個。 調用 RedirectFromLoginPage 方法,以便自動生成窗體身份驗證 Cookie,並將用戶重定向到 cmdLogin_ServerClick 事件中的相應頁: private void cmdLogin_ServerClick(object sender, System.EventArgs e) { if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked); else Response.Redirect(logon.aspx, true); } 生成身份驗證票證,對其進行加密,建立 Cookie,將其添加到響應中並重定向用戶。這樣,您就能夠更好地控制 Cookie 的建立方式了。在本例中還可包括自定義數據和 FormsAuthenticationTicket 。 private void cmdLogin_ServerClick(object sender, System.EventArgs e) { if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) { FormsAuthenticationTicket tkt; string cookiestr; HttpCookie ck; tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, your custom data); cookiestr = FormsAuthentication.Encrypt(tkt); ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); if (chkPersistCookie.Checked) ck.Expires=tkt.Expiration; ck.Path = FormsAuthentication.FormsCookiePath; Response.Cookies.Add(ck); string strRedirect; strRedirect = Request[ReturnUrl]; if (strRedirect==null) strRedirect = default.aspx; Response.Redirect(strRedirect, true); } else Response.Redirect(logon.aspx, true); } 5. 確保將如下代碼添加到由 Web 窗體設計器生成的代碼的 InitializeComponent 方法中。 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. 雙擊 SignOut 打開代碼隱藏頁 (Default.aspx.cs),並在 cmdSignOut_ServerClick 事件處理程序中複製如下代碼: private void cmdSignOut_ServerClick(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect(logon.aspx, true); } 6. 確保將如下代碼添加到由 Web 窗體設計器生成的代碼的 InitializeComponent 方法中。 this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick); 7. 保存並編譯項目。如今,您就可使用該應用程序了。 返回頁首 其餘說明 您可能但願將密碼安全地存儲在數據庫中。在將密碼存儲在數據庫或配置文件中以前,可使用名爲 HashPasswordForStoringInConfigFile 的 FormsAuthentication 類實用工具函數對密碼進行加密。 您可能但願將 SQL 鏈接信息存儲在配置文件 (Web.config) 中,以便在須要時方便地修改它。 也能夠考慮添加代碼,以防***使用不一樣的密碼組合進行登陸。例如,能夠包含一個只容許兩次或三次登陸嘗試的邏輯。若是用戶在嘗試特定次數後沒法登陸,您可能但願在數據庫中設置一個標誌以禁止此用戶登陸,直到此用戶經過訪問另一個頁面或撥打您的支持電話從新啓用其賬戶時爲止。另外,還應根據須要添加相應的錯誤處理代碼。 由於用戶是基於身份驗證 Cookie 來標識的,因此您可能但願在此應用程序上使用安全套接字層 (SSL),這樣任何人都沒法騙取身份驗證 Cookie 和傳輸的任何其餘重要信息。 基於窗體的身份驗證要求客戶機在其瀏覽器上接受或啓用 Cookie。 authentication 配置部分的 timeout 參數控制從新生成身份驗證 Cookie 的時間間隔。您能夠選擇一個能提供較好性能和安全性的值。 Internet 上的某些中間代理和緩存可能會將包含設置 Cookie標題的 Web 服務器響應緩存起來,而後將其返回給另一個用戶。由於基於窗體身份驗證使用 cookie 來驗證用戶身份,因此這可能致使用戶經過接收到由中間代理或緩存提供的本不是要發送給他們的 cookie 而意外(或有意地)模擬另外的用戶。下面這篇文章介紹如何對付這些情形: 263730 Site Server 用戶可能被驗證成錯誤的賬戶 返回頁首 參考 有關如何使用 credentials 部分存儲用戶和密碼來實現基於窗體的簡單身份驗證的更多信息,請參閱如下 GotDotNet ASP.NET 快速入門示例: 基於窗體的身份驗證 http://www.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx 有關如何使用 XML 文件存儲用戶和密碼來實現基於窗體的身份驗證的更多信息,請參閱 .NET Framework 軟件開發工具包 (SDK) 文檔中的如下主題: 使用 XML 用戶文件的窗體身份驗證 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp 有關 ASP.NET Web 應用程序安全性的更多信息,請參閱如下 Microsoft .NET Framework 開發人員指南文檔: ASP.NET Web 應用程序安全性 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetwebapplicationsecurity.asp 有關 System.Web.Security 命名空間的更多信息,請參閱如下 Microsoft .NET Framework 參考文檔: System.Web.Security 命名空間 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp 有關 ASP.NET 配置的更多信息,請參閱如下 Microsoft .NET Framework 開發人員指南文檔: 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 白皮書: ASP.NET 中的身份驗證:.NET 安全指南 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/authaspdotnet.asp 有關 ASP.NET 的更多常規信息,請訪問如下 MSDN 新聞組: microsoft.public.dotnet.framework.aspnet 返回頁首 這篇文章中的信息適用於: 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 標準版 Microsoft SQL Server 7.0 標準版 Microsoft SQL Server 2000 64-bit Edition
相關文章
相關標籤/搜索