利用.net的內部機制在asp.net中實現身分識別驗證

來源:互聯網
上載者:User

在.net內部存在一些預設機制,具體說來有如下:
(1)如果類的執行個體欄位沒有賦初始值,那麼它們就會被賦預設值,對於參考型別欄位的預設值為null,對於簡單實值型別欄位(即數實值型別)預設值為對應形式的0(如sbyte、byte、short、ushort、int、uint、long 和 ulong都是0,而char類型欄位的預設值值是’/0x0000’,float類型欄位是0.0f,double類型欄位是0.0d等等)。
(2)如果類中賦初值的靜態欄位,那麼自動產生一個靜態建構函式,在靜態函數中完成賦初值。
(3)如果一個類沒有明確指明派生自哪個類,預設會派生自Object類。
(4)如果一個類沒有定義任何建構函式,預設會給該類產生一個建構函式。
(5)在調用子類的非靜態建構函式的時候,預設會調用父類的建構函式。例如A繼承B,B繼承C,C沒有明確指明繼承哪個類(實際上是繼承Object),那麼在執行個體化A的時候,會首先調用B的建構函式,在調用的建構函式的時候又會調用C的建構函式,在調用C的建構函式的時候又會去調用Object的建構函式,因此執行個體化一個A對象時,在內部會經曆一連串的建構函式調用,就上面的繼承層次來說,建構函式的調用順序從先到後依次為:object->C->B->A。
下面這部分代碼可以示範這個示範這個過程:

using System;</p><p>public class C<br />{<br /> public C()<br /> {<br /> Console.WriteLine("C");<br /> }<br />}<br />public class B:C<br />{<br /> public B()<br /> {<br /> Console.WriteLine("B");<br /> }<br />}<br />public class A:B<br />{<br /> public A()<br /> {<br /> Console.WriteLine("A");<br /> }<br />}</p><p>public class Demo:A<br />{<br /> static int d=5;<br /> public Demo()<br /> {<br /> }<br /> public static void Main()<br /> {<br /> Demo d = new Demo();<br /> Console.ReadLine();<br /> }<br />}

將上面程式編譯成控制台應用程式,執行會得到如下結果:
 
如果將產生的Demo.exe檔案用ILDASM.exe開啟的話,會看到如下情形:
 

上面說的這些都不是我今天要說的重點,不過我們可以它們來實現一些功能。在早期的時候我開發項目的時候,做後台身份控制的時候總是覺得比較麻煩,每頁都會寫檢查使用者是否登入的代碼,後來asp.net2.0出來之後就使用了母板頁,這樣對使用者的身分識別驗證就可以在母板頁中的Load事件中來控制。這樣雖然能完成功能,不過由於母板頁的Load事件是晚於內容頁的Load事件的,所以這個時候驗證使用者身份可以看到頁面上的部分內容了。
利用上面的第(5)個機制,就可以比較好的解決這個問題。我們可以首先定義一個後台所有需要進行身分識別驗證的頁的基類,這個基類繼承自System.Web.UI.Page類(因為在asp.net中所有的asp.net頁所對應的類必須直接或者簡介繼承自System.Web.UI.Page類)。我們直到當訪問一個頁面的時候,肯定要執行個體化這個頁面對應的類,由於內部機制必須要首先調用我們編寫的基類中定義的構造方法(如果有的話,然後又雞生蛋、蛋生雞一樣地追朔到object類,不過那些我們不用管)。我們要下手的話,就應該在這個我們自訂的基類的構造方法裡面。這時候有兩種選擇:
一是直接在基類的建構函式進行身分識別驗證,比如在基類建構函式裡檢查Cookie或者Session集合中是否存在某個特定的名稱的Session或者Cookie(用Session或者用Cookie或者二者兼用取決於具體項目要求),這個特定名稱的Session或者Cookie是當使用者登入了後台時才會設定的,因此只要存在這個Cookie或者Session就可以判斷使用者是登入過的。
二是再利用一些機制來做,比如在基類的建構函式中再利用一個asp.net頁面的生命週期中必經的事件來進行處理。比如這個在建構函式中定義基類的某個事件的處理方法,在這個處理方法中進行身份判斷。
我記得有人說過這麼一句話:“最直接的方法往往是最難的方法。”上面的辦法中,第一種是實現不了的,因為建構函式調用的時候,很多資訊剛剛被初始化,有很多還沒有被初始化,在基類的構造方法中Session和Cookie都是沒有被執行個體化的。
看來只有用第二種辦法了,看過《asp.net夜話之五:Page類和回調技術》之五的朋友應該有印象,所有的Page類都會經曆一個載入事件,我們就選擇在基類的建構函式中定義基類的載入事件的處理方法,在這個方法裡檢查使用者是否登入。至於為什麼要選擇這個事件而不用其它事件,那是因為有些事件發生得還是太早,怕Session和Cookie還是不可用,有些事件又太晚,用載入事件是剛剛好(郭德鋼有一首歌正好叫《剛剛好》,呵呵)。
因為我們的這個基類沒有任何顯示部分代碼,所以我們可以在項目中添加一個類檔案,代碼如下:

using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</p><p>/// <summary><br />/// AdminPage是後台所有需要身分識別驗證的頁的基類<br />/// </summary><br />public class AdminPage:System.Web.UI.Page<br />{<br />public AdminPage()<br />{<br /> //處理載入事件<br /> this.Load += new EventHandler(AdminPage_Load);<br />}</p><p> void AdminPage_Load(object sender, EventArgs e)<br /> {<br /> //假設使用者登入成功之後會設定一個名為“UserInfo”的Session<br /> //假設使用者登入頁面login.aspx位於網站根目錄下的Admin檔案下<br /> if (Session["UserInfo"] == null)<br /> {<br /> //使用~來保證無論在什麼目錄層次進行身分識別驗證都能跳轉到後台登入頁面<br /> Response.Redirect("~/Admin/Login.aspx");<br /> }<br /> }<br />}

這樣,對於後台任何需要進行身分識別驗證的頁面,只需將它更改為繼承自AdminPage類即可,這樣這些類中就不需要編寫任何身分識別驗證的代碼了。
如下,就是一個類的代碼,這裡沒有任何手動編寫的代碼,卻已經能實現驗證了,因為它繼承自AdminPage類:

using System;<br />using System.Data;<br />using System.Configuration;<br />using System.Collections;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Web.UI.HtmlControls;</p><p>public partial class Admin_News_Index : AdminPage<br />{<br /> protected void Page_Load(object sender, EventArgs e)<br /> {</p><p> }<br />}

對上面的處理方法還可以進一步處理,比如某些頁面不光要求使用者必須登入,還要求使用者必須具有相關許可權,讀者朋友可以利用這種思想去實現。此外,還可以利用這種機製做一些其它的業務處理。

周公(周金橋)與2009-2-11 09:15

 

另外,《asp.net夜話》測試版視頻第四章已經錄製完成並發布,可以到http://blog.xunlei.com/web/category.html?uin=zhoufoxcn&category_id=1847下載,此次發布將以前的發布格式全部更改為AVI格式了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.