關(guān)于Forms驗(yàn)證 關(guān)于Forms驗(yàn)證的最好的教程,我覺得是microsoft press 出的黑皮書《microsoft.net 程序設(shè)計技術(shù)內(nèi)幕》里的關(guān)于這一部分的講解,此書的中文版由清華大學(xué)出版社出版。大家方便找到的話,可以看看。
窗體驗(yàn)證是asp.net最酷的新特性之一。簡單說,窗體驗(yàn)證是一種安全機(jī)制,它通過要求用戶在web窗體中輸入憑據(jù)(通常是用戶名和密碼)來驗(yàn)證用戶身份。您可以在web.config中指定登錄頁面并告訴asp.net登錄頁面保護(hù)什么資源。當(dāng)用戶第一次試圖訪問被保護(hù)資源時,asp.net會把用戶重新定向到您的登錄頁面。如果登陸成功,asp.net會以cookie的形式發(fā)給用戶一個驗(yàn)證票據(jù),并把用戶重定向到最初請求的頁面。這張票據(jù)使得用戶不必重復(fù)登錄,就可以多次訪問您站點(diǎn)上的被保護(hù)內(nèi)容。您控制這張票據(jù)的生存期,所以由您決定登錄適用于多長時間。 上面這段話明白嗎?我們可以想以前asp的時候,要保護(hù)的頁面都會有對cookie(或session)的判斷,根據(jù)cookie的值來判斷用戶是否有訪問這個頁的權(quán)力。而具體做的時候,都是先要求用戶登陸,成功后就把用戶信息保存在cookie里面,然后用戶就可以訪問受保護(hù)的頁。而現(xiàn)在asp.net提供了一種更加方便的功能來替你完成這些工作,就是上面說的Forms驗(yàn)證。就像分頁,以前asp不也替你完成了嘛,可是到了asp.net這里,就得自己動手了…… 過程是先建一個文件夾,然后把要保護(hù)的頁面放進(jìn)去,接著設(shè)置一下web,config,這樣就完成了保護(hù)。如果你要訪問這個文件夾,就會被強(qiáng)制轉(zhuǎn)到預(yù)先設(shè)定的登錄頁面,你填上正確的用戶名和密碼,提交,系統(tǒng)驗(yàn)證后,就把你的登陸信息寫到cookie里面,這樣你再去訪問那個文件夾,就可以進(jìn)去了,因?yàn)槟愕牡顷憫{證已經(jīng)保存到cookie里面了,系統(tǒng)檢查后,知道你不是壞人,于是就……這個過程還是和以前asp時的過程差不多。 下面是具體的操作,先要建一個asp.net應(yīng)用程序,這里面至少要有一個登錄用的頁面,然后修改你的根目錄下的web.config,把驗(yàn)證那一塊改成Forms驗(yàn)證模式。 CODE: <authentication mode="Forms" > <forms loginUrl="login.aspx"> </forms> </authentication> 注意里面有一個forms節(jié),定義了登錄頁面的位置,如果不指定,則默認(rèn)是根目錄下的login.aspx,還有,里面是區(qū)分大小寫的。 通過這個設(shè)置,系統(tǒng)就知道這個asp.net應(yīng)用程序使用Forms驗(yàn)證。 接下來在要保護(hù)的文件夾里放一個web.config,要注意的是,這個子文件夾里的web.config的實(shí)際內(nèi)容不能像根目錄下的那個一樣多,否則就會出現(xiàn)“配置錯誤”,提示“在應(yīng)用程序級別以外使用注冊為 allowDefinition='MachineToApplication' 的節(jié)是錯誤的。導(dǎo)致該錯誤的原因可能是在 IIS 中沒有將虛擬目錄作為應(yīng)用程序進(jìn)行配置。”具體應(yīng)該怎么做我也不清楚,總之這個web.config只要有下面的內(nèi)容就ok了 CODE: <configuration> <system.web> <authorization> <deny users="?"></deny> </authorization> </system.web> </configuration> 這是一個授權(quán)節(jié),此節(jié)設(shè)置應(yīng)用程序的授權(quán)策略??梢栽试S(allow)或拒絕(deny)不同的用戶或角色訪問應(yīng)用程序資源。通配符: "*" 表示任何人,"?" 表示匿名(未經(jīng)身份驗(yàn)證的)用戶。看我們上面的設(shè)置知道,這樣配置就是拒絕未經(jīng)身份驗(yàn)證的用戶訪問。 然后可以試試訪問那個受保護(hù)的文件夾里的頁面了,嘿嘿,是不是立刻就被轉(zhuǎn)到login.aspx了?這就是Forms驗(yàn)證的威力了,你必須要在這里正確登陸,然后才可以訪問受保護(hù)的資源。 接下來自然就是登陸的問題了。 想想在asp的時代,我們的登陸事件是這樣的: CODE: sql="select name,password from yourtable where name="&name&" password="&password set rs=con.execute(sql) if not rs.eof cookie("login")="ok" end if 上面是基本的過程了,注意這個做法是極不安全的,這里只是一個示例,而在Forms驗(yàn)證時的過程也差不多,即 if(1.輸入的用戶名和密碼合法) then 2.給用戶設(shè)定登陸憑證 end if 先看第一步,怎樣檢查輸入的用戶名和密碼合法,這里有兩個辦法,如果你是把用戶名和密碼存在數(shù)據(jù)庫里面,那就用以前的辦法來解決,比如是islogin(string name,string password)方法,如果你輸入正確的用戶名和密碼的話,這個方法就返回true。這個辦法適用于很多用戶的時候。 如果你的用戶數(shù)量很少,那就可以考慮第二種辦法,即把用戶和密碼放到web.config里。辦法就是在根目錄下的web.config文件中加入一個credentials節(jié),這個是包含在forms節(jié)里面的 CODE: <authentication mode="Forms" > <forms loginUrl="login.aspx"> <credentials passwordFormat="Clear"> <user name="notus" password="wei"/> </credentials> </forms> </authentication> 在這里設(shè)置后,程序中的判斷是用System.Web.Security的FormsAuthentication類的一個方法System.Web.Security.FormsAuthentication.Authenticate(string name,string password),這個就是用來根據(jù)web.config文件中的credentials節(jié)指定的用戶名和密碼來進(jìn)行合法性判斷,如果你輸入正確的話,這個方法就返回true。 驗(yàn)證完后,就進(jìn)入第二個步驟給用戶設(shè)定登陸憑證,這里也是用到System.Web.Security的FormsAuthentication類的一個方法 System.Web.Security.FormsAuthentication.RedirectFromLoginPage(string,bool)這個方法接受兩個參數(shù),第一個string是用語cookie身份驗(yàn)證的用戶名稱,一般就用用戶名,第二個是bool值,用于指定此cookie是臨時的,還是永久性的,如果這里用false,那就是臨時性的。臨時性的cookie的生存期可以在web.config的forms節(jié)中指定 <forms loginUrl="login.aspx" timeout="10"> 這里是把超時時間設(shè)為10分鐘。而永久性cookie的生存期是50年,并且設(shè)定后就不可以更改,一般如果選擇永久性的cookie的話,可以通過編程的辦法來改變這個值,畢竟50年實(shí)在是太長了。 這個方法除了設(shè)定用戶登陸憑證外,在最后還會把用戶重定向到最初請求的頁面,即當(dāng)你沒有登錄而直接進(jìn)入受保護(hù)的文件夾時想去的那個頁面。如一開始直接進(jìn)入登錄頁面,則最后會轉(zhuǎn)向根目錄下的default.aspx。 下面是具體的代碼演示,這段代碼是單擊登陸頁面的提交按鈕后執(zhí)行的,boxid和boxpd分別是輸入用戶名和密碼的textbox CODE: 第一種,用戶資料保存于數(shù)據(jù)庫時 private void butlogin_Click(object sender, System.EventArgs e) { if(islogin(boxid.Text,boxpd.Text)) FormsAuthentication.RedirectFromLoginPage(boxid.Text,false); else Response.Write("error"); } 第二種,用戶資料保存于web.config時 private void butlogin_Click(object sender, System.EventArgs e) { if(FormsAuthentication.Authenticate(boxid.Text,boxpd.Text)) FormsAuthentication.RedirectFromLoginPage(boxid.Text,false); else Response.Write("error"); } 這就是驗(yàn)證的基本過程。 而如果想要注銷登陸,則用System.Web.Security的FormsAuthentication類的SignOut()方法 CODE: private void butquit_Click(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); } 它返回一個Set-Cookie頭,將Cookie的值設(shè)置為一個空字符串,并將Cookie的到器日期設(shè)置為一個過去的日期,從而有效銷毀驗(yàn)證cookie。 而在實(shí)際情況下,您可能更愿意在頂層web.config文件中完成所有的url授權(quán),而不是把它們分在各自目錄下的web,config文件中。asp.net也支持這種做法。下面這個web,config文件,放在應(yīng)用程序根目錄下,它啟用窗體驗(yàn)證并指定其他的一些設(shè)置。假設(shè)您要保護(hù)的文件夾名為protd。 CODE: <configuration> <system.web> <authentication mode="Forms" > <forms loginUrl="login.aspx"> <credentials passwordFormat="Clear"> <user name="notus" password="wei"/> </credentials> </forms> </authentication> </system.web> <location path="protd"> <system.web> <authorization> <deny users="?"></deny> </authorization> </system.web> </location> </configuration> 注意它的層次結(jié)構(gòu),應(yīng)該有兩個<system.web>節(jié)。完成這個后,就可以把protd文件夾下的那個web.config刪掉,然后看看效果如何。 基本的知識就這么多了,其實(shí)Forms驗(yàn)證還有很多內(nèi)容,比如怎樣以編程的方式改變永久性cookie的生存期,怎么使用基于角色的驗(yàn)證等,這些大家找相關(guān)資料研究研究吧。當(dāng)然還是推薦上面說到的那本書,以前關(guān)于Forms驗(yàn)證的也看了不少資料,但總是不明白,結(jié)果昨天一看那本書的講解,就豁然開朗了。 最后再給出我常用的一個islogin()代碼。希望可以對初學(xué)者有些幫助。 CODE: public bool islogin(string name,string password) { bool isok=false; string errmsg="ok"; StringBuilder sbsel=new StringBuilder(); sbsel.Append("select name,password from youtable where name='"); sbsel.Append(name); sbsel.Append("'"); try { cmd=new OleDbCommand(sbsel.ToString(),conn); conn.Open(); OleDbDataReader dr=cmd.ExecuteReader(CommandBehavior.SingleRow); if(dr.Read()) { if(dr["password"].ToString()==password) isok=true; } errmsg="login is ok"; } catch(OleDbException ex) { errmsg=ex.Message; } finally { conn.Close(); } return isok; |
|