(一)關於“許可權驗證”的基礎知識:
通常我們注意到有這樣一個現象:在某些論壇中我們可以查看別人的文章,但是如果你點擊了回複,不是跳轉到Reply類似的回複頁面而是跳轉到了Login.aspx頁面。如果您不知道ASP.NET中還存在著這麼一個可以方便檢測是否是匿名使用者登入的功能,通常你會選擇Session去記錄,簡略的代碼往往是這樣:
- 先寫一個類,直接繼承於System.Web.UI.Page,然後這樣Coding:
Public partial class RegisterRequired : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session[“username”]==null)
{
Response.Redirect(“Login.aspx?FromUrl=” + Request.Url.AbsoluteUri
”);
}
}
}
- 你可以在需要驗證的頁面讓它直接繼承RegisterRequired,在Login頁面自己寫一些方法去驗證,然後直接:Response.Redirect(Request[“FromUrl”])即可。
這樣做當然是毫無問題,但是需要反覆指定重新導向之類的功能,比較囉嗦。相對而言,微軟已經抽象出了一個類,叫做FormsAuthentication,專門用於發布憑據(驗證當前客戶是否是匿名還是已經登入的)。該類使用Cookie進行驗證。
1)首先需要在Web.config中的<system.web>節點進行配置:
<authentication Mode=”Forms”>
<forms Name=”Cookie的Name” Timeout=”60” Cookieless=”AutoDetect” slidingExpiration=”true” loginUrl=”Login.aspx” />
<authentication>
我們通常只要這樣設定就可以了,現在來逐一解釋以下各個主要參數的妙用:
- Name:Cookie的名字,您可以自訂。
- Timeout:指定Cookie到期的時間,超過了這段時間Cookie作廢(意味著你如果點擊了某個頁面之後間隔Timeout的時間段,再次重新導向到某個不允許匿名使用者的頁面,會重新回到loginUrl指定的頁面要求重新登入,單位:秒)。
- Cookieless:Cookie的模式(建議使用自動檢測,防止某些使用者禁用了Cookie;此時,Cookie將作為字串嵌入到當前的地址欄中去)。
- slidingExpiration:設定Cookie到期的模式:
如果是true,意味著只要使用者瀏覽頁面,Cookie的時間將自動在上一次的時間基礎上再度重新開始計時(比如你定義30,那麼當第29秒的時候你在登入的情況下重新導向到某個頁面了,此時Cookie又從0秒開始計時,到下一個30秒一次也不操作才算作廢)。
如果是false,則只能在規定的秒內瀏覽,超過自動重新導向(建議true)。
- loginUrl:如果沒有Cookie(匿名使用者)訪問不允許匿名使用者存取的頁面時候,自動重新導向到登入頁面,強制使用者登入擷取Cookie。
2)在完成這些操作以後,在<system.web>節點中您還要指定哪些頁面(不)允許匿名訪問:
<authorization>
<allow users=”*”/>
<deny users=”?”/>
</authorization>
這種定義表示:在web.config定義的同級目錄下的所有頁面都必須在擷取憑據(Cookie)之後才允許您訪問(“*”表示任何使用者,“?”表示匿名使用者),不然直接重新導向到登入頁面。
通常情況下,一般Default.aspx頁面是允許別人進行訪問的(放置於web程式的根目錄下,其餘的根據需求放在不同的檔案夾裡)。如果要設定“匿名使用者除了可以直接存取Default.aspx,其餘什麼都不可以”的情況下,這樣做比較符合:
- 和Default.aspx同目錄下的那個web.config中不要寫(<authorization>。
- 在需要驗證的檔案夾中建立一個web.config,然後寫上ii)的“<authorization>
”部分即可。
如果你喜歡將不同檔案夾的不同頁面配置全部寫在根目錄的那個web.config中,您可以這樣做:
<location path=”頁面或者是檔案夾”>
<system.web>
<authorization>
<allow users=”*”/>
<deny users=”?”/>
</authorization>
</system.web>
</location>
3)完成了以上的步驟之後,您只要在某個頁面(比如登入頁面,發放Cookie憑據給目前使用者就可以了):
if (判斷登入條件)
……
FormsAuthentication.SetAuthCookie (憑據名稱, 是否跨瀏覽器支援)
if (string.IsNullOrEmpty(Request[“ReturnUrl”]))
{
Response.Redirect (“預設頁面”);
}
Response.Redirect (Request[“ReturnUrl”]);
這裡解釋一下:
- “憑據名稱”:應該是唯一的使用者非匿名的憑據名(最好是Id或者是之後所講的MemberShip中的UserName,這樣你可以直接從User.Identity.Name擷取這個Id,以便後續的操作)
- “是否跨瀏覽器支援”:用於指定是否對於不同瀏覽器進程之間享用同一個Cookie。
- ReturnUrl:是某個不允許匿名使用者存取的頁面路徑,當使用FormsAuthentication.SetAuthCookie給目前使用者分發憑據的完畢之後,判斷ReturnUrl是否為空白(不為空白直接跳轉到那個頁面,否則人為指定一個頁面)。
當然,如果ReturnUrl肯定不為空白,您直接可以這樣做:
FormsAuthentication.RedirectFromLoginPage(憑據名稱, 是否跨瀏覽器支援) 。
除了登入之外,“登出”(SignOut也是一個非常實用的功能),實際上你可以自己在頁面中這樣做:FormsAuthentication.SignOut();
(二)ASP.NET中的Login控制項:
ASP.NET中實際上已經為你現成提供了一個成為Login的控制項,這樣你就不必總是去自訂登入控制項了。您可以在Login_Authenticate中寫驗證代碼:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
//判斷條件
e.Authentication = true; //必須加入,相當於是SetAuthCookie的功能,可以直接在User.Identity.Name擷取UserTextBox中的Name。
Response.Redirect(…..);
}
或者你直接指定Login1的DestinationPageUrl屬性,這樣一旦成功登入後就自動跳轉到該屬性指定的頁面了。
(三)ASP.NET中登出控制項:
我們通常看到的登入頁面往往是:如果匿名使用者存取登入頁面,應該出現登入的提示框(輸入使用者名稱、口令等資訊),當成功登入之後該提示框出現“歡迎XXX登入”的字樣,然後底下有一個按鈕,允許你登出。這個我們完全可以不寫任何代碼,直接通過拖拽控制項實現:
除了剛才講的登入控制項之外,我們還需要三個控制項:LoginView、LoginStatus和LoginName。
LoginView不直接使用,它包含兩個模板:AnoymousTemplate和LoggedTemplate(RoleGroupTemplate稍後在角色部分講到)。我們通常把Login控制項放在AnoymousTemplate中,在LoggedTemplate中放上一個LoginName(自動顯示登入以後的名字),同時放上一個LoginStatus控制項(預設LogOut狀態),當使用者點擊之後再次成為匿名使用者。