義艷剛
(武漢船舶職業(yè)技術(shù)學(xué)院實(shí)訓(xùn)中心,湖北武漢 430050)
在Visual Studio.NET中開發(fā)Web應(yīng)用程序項(xiàng)目時(shí),在默認(rèn)情況下,任何人都可以訪問這些Web頁面。如果想拒絕某些不受歡迎的人訪問頁面,這就需要對(duì)訪問頁面的用戶進(jìn)行“身份驗(yàn)證”。
ASP.NET中支持三種類型的身份驗(yàn)證:Windows身份驗(yàn)證,它結(jié)合Internet信息服務(wù)(IIS)身份驗(yàn)證,只允許某些 Windows賬戶訪問頁面;Passport身份驗(yàn)證,它是由 Microsoft提供的集中身份驗(yàn)證服務(wù),用于為其成員站點(diǎn)提供單一登錄和核心配置服務(wù);Forms身份驗(yàn)證,它是使用自定義表單來實(shí)現(xiàn)身份驗(yàn)證,這是最流行的身份驗(yàn)證方法。
當(dāng)用戶訪問使用Forms身份驗(yàn)證的頁面時(shí),他們會(huì)被重新定向到一個(gè)登錄頁面。在這個(gè)頁面,用戶可以提供用戶名和密碼,然后檢查其身份驗(yàn)證信息是否有效,并據(jù)此授權(quán)或拒絕訪問頁面。本文主要對(duì)ASP.NET的Forms身份驗(yàn)證進(jìn)行討論。
Web.config文件是一個(gè)XML文本文件,它用來儲(chǔ)存ASP.NET Web應(yīng)用程序的配置信息。在Visual Studio.NET中新建一個(gè)Web應(yīng)用程序后,默認(rèn)情況下會(huì)在站點(diǎn)的根目錄下自動(dòng)創(chuàng)建一個(gè)默認(rèn)的Web.config文件,包括默認(rèn)的配置設(shè)置,所有的子目錄都繼承它的配置設(shè)置。通過對(duì)Web.config文件進(jìn)行重寫或修改,可以設(shè)置ASP.NET Web應(yīng)用程序的Forms身份驗(yàn)證方式,設(shè)置步驟如下:
(1)在項(xiàng)目解決方案中打開 Web.config文件,編輯<authentication>元素,設(shè)置應(yīng)用程序的身份驗(yàn)證方式為“Forms”,并為應(yīng)用程序提供一組有效的用戶,如下所示。
(2)在 Web.config文件中,從<authorization>元素中刪除<allow users=”*”/>行。因?yàn)檫@一行向任何人授予訪問權(quán)限,所以需要?jiǎng)h除。
(3)在 Web.config文件的<authorization>元素中,添加<deny users=”?”/>行,拒絕所有未通過身份驗(yàn)證的用戶。
(4)創(chuàng)建一個(gè)名為“l(fā)ogin.aspx”的頁面。在默認(rèn)情況下,所有未通過身份驗(yàn)證的用戶都會(huì)被重新定向到這個(gè)頁面。在該頁面中添加兩個(gè)TextBox控件(txt_Username和txt_password),以便用戶提供身份驗(yàn)證信息;添加一個(gè)CheckBox控件(chkPersist),供用戶選擇是否由計(jì)算機(jī)保存身份驗(yàn)證信息,方便下一次自動(dòng)登錄;添加一個(gè)Button控件(bt_login)作為登錄按鈕,以便用戶登錄網(wǎng)站進(jìn)行身份驗(yàn)證。
(5)給login.aspx頁面的登錄按鈕添加如下代碼:If System.Web.Security.FormsAuthentication.Authenticate(_txt_Username.Text,txt_password.Text)=True then'驗(yàn)證用戶身份System.Web.Security.FormsAuthentication.RedirectFormLoginPage(_txt_Username.Text,chk-Persist.Checked)'驗(yàn)證通過,重新定向到最初請(qǐng)求的頁面ElseRespone.Write(“用戶名或密碼錯(cuò)誤!”)'驗(yàn)證沒通過,顯示錯(cuò)誤信息End If至此,使用Web.config設(shè)置ASP.NET Forms身份驗(yàn)證就完成了。現(xiàn)在,當(dāng)用戶訪問應(yīng)用程序中的頁面時(shí),如果未通過身份驗(yàn)證,他就會(huì)被重新定向到login.aspx頁面。在該頁面上,用戶提供用戶名和密碼后,.Authenticate方法會(huì)嘗試將這些身份驗(yàn)證信息與Web.config文件中定義的用戶信息進(jìn)行比較。如果用戶提供的驗(yàn)證信息是無效的,就會(huì)顯示一個(gè)錯(cuò)誤消息;如果該信息是有效的,就運(yùn)行.RedirectFormLoginPage方法將用戶重新定向到最初請(qǐng)求的頁面。
在開發(fā)Web應(yīng)用程序項(xiàng)目時(shí),如果只有幾個(gè)核心用戶組訪問站點(diǎn),可以很容易地將用戶身份信息存儲(chǔ)在 Web.config文件中;否則,使用Web.config設(shè)置ASP.NET Forms身份驗(yàn)證就不是很有效了。而且,用戶密碼存儲(chǔ)在純文本的XML中,開發(fā)小組中的任何人都可以提取這些信息,將影響到用戶身份信息的安全。
此時(shí),將用戶身份信息存儲(chǔ)在數(shù)據(jù)庫中,使用數(shù)據(jù)庫中的信息來驗(yàn)證用戶的身份就比較可靠了,具體步驟如下:
(1)建立一個(gè)數(shù)據(jù)庫(mydatabase.dbf),在數(shù)據(jù)庫中建立一個(gè)用戶身份信息表(表名:tab_users,包含列username和password)。
(2)編輯 Web.config文件,把<authentication>元素修改為<authentication mode=”Forms”/>;從<authorization>元素中刪除<allow users=”*”/>行;添加<deny users=”?”/>行。
(3)創(chuàng)建login.aspx頁面,如前所述。
(4)給login.aspx頁面的登錄按鈕添加代碼,這里不使用.Authentication方法,使用ADO.NET代碼查詢用戶身份信息表,并檢查所提供信息的有效性。如果信息有效,就運(yùn)行.RedirectFormLoginPage方法將用戶重新定向到最初請(qǐng)求的頁面。代碼如下:
在開發(fā)Web應(yīng)用程序項(xiàng)目時(shí),有些情況下,站點(diǎn)的部分頁面需要向任何人開放,而另一部分頁面需要用戶身份驗(yàn)證,只有已授權(quán)用戶才能訪問。當(dāng)然,這可以通過保存一些Session會(huì)話變量和(或者)使用cookie來實(shí)現(xiàn),但還有一種更簡(jiǎn)單的解決方案,它仍然允許使用ASP.NET Forms身份驗(yàn)證,但只用于站點(diǎn)的部分頁面,具體的步驟如下:
(1)修改Web.config文件,以使用Forms身份驗(yàn)證。如前所述,如果使用Web.config文件存儲(chǔ)用戶,則編輯<authentication>元素,設(shè)置應(yīng)用程序的身份驗(yàn)證方式為“Forms”,并為應(yīng)用程序提供一組有效的用戶;如果使用數(shù)據(jù)庫存儲(chǔ)用戶,則把<authentication>元素修改為<authentication mode=”Forms”/>。
(2)因?yàn)椴糠猪撁嫘枰蛉魏稳碎_放,所以不需要從<authorization>元素中刪除<allow users=”*”/>行,也不需要添加<deny users=”?”/>行。
(3)在 Web.config文件中,在<configuration>元素的后面添加如下代碼:
代碼中,用要保護(hù)的頁面替代checkpage.aspx,以確保ASP.NET拒絕任何未通過身份驗(yàn)證的用戶訪問這個(gè)頁面。如果有多個(gè)要保護(hù)的頁面,則添加多個(gè)<location>塊,在路徑path參數(shù)中也可以包含文件夾和文件名。
創(chuàng)建login.aspx頁面,如前所述。
給login.aspx頁面的登錄按鈕添加相應(yīng)的身份驗(yàn)證代碼。
現(xiàn)在,創(chuàng)建了一個(gè)這樣的 Web應(yīng)用程序,它使用Forms身份驗(yàn)證,在默認(rèn)情況下允許任何用戶訪問,但是在Web.config文件中添加了一個(gè)<location>子句,要求所有試圖訪問checkpage.aspx頁面的用戶都必須通過身份驗(yàn)證,當(dāng)他們?cè)L問該頁面時(shí)就會(huì)被重新定向到login.aspx頁面。
如前所述,本文介紹了使用Web.config存儲(chǔ)用戶、使用數(shù)據(jù)庫存儲(chǔ)用戶、只驗(yàn)證站點(diǎn)的部分頁面等三種ASP.NET Forms身份驗(yàn)證,詳細(xì)介紹了這三種Forms身份驗(yàn)證的設(shè)置步驟和實(shí)現(xiàn)代碼。