簡介:
         網站登入是網路資料庫最常用的例子,資料庫內至少必須有會員的帳號與密碼,通常還會有Email與其他個人資料,為了網路安全起見,登入機制可以做得很複雜,ASP.NET也提供了會員管理的機制,將資料庫封裝在裡面,使用者只須定義帳密與身分就可以建立資料與管理。但是本單元目的是基本概念的學習,事實上是使用SQL資料庫手動建立一個會員資料庫,再用網頁登入控制項寫出登入機制程式,並依據登入的身分轉到不同的網頁,進行不同的瀏覽或工作。

建立會員資料庫
首先請參考『建立SQL資料庫』單元在一個空的ASP.NET網站內建立一個資料庫,加入一張名為『會員資料』的資料表,有個小地方改變一下,就是帳號與密碼欄位的資料型別改成 nvarchar(MAX),然後修改MAX為10。預設的nchar(10)表示固定長度10個字元,如果輸入資料不足10個字會填上空白,這在寫程式時常常產生誤會,nvarchar(10)則是長度可變動,但最長為10字元。

完成的欄位定義應該如下,Email的字數允許多一點,「身分」欄內容會決定登入之後使用者的權限或工作項目:

別忘了改資料表名稱:

接著輸入幾筆資料如下:

在資料庫中 NULL 就是空的意思,帳號是主索引鍵,所以不能空白(強迫要填),其他三欄不填就會顯示 NULL

網頁表單設計
請直接加入三個Web Form網頁,預設應該是Default.aspx, Default2.aspx, Default3.aspx。
在第一頁Default.aspx加入工具箱「登入」類的 Login 物件,再使用一個 Gridview 物件顯示帳號與密碼與身分,執行網頁的畫面如下圖:

接著到 Default2.aspx 寫入一句歡迎詞,或貼上一張圖片,代表稍後「一般」身分者會直接進入的網頁。
再到Default3.aspx參考『建立SQL資料庫單元』加入一個GridView物件與FormView物件,連接會員資料表,並設定為可以編輯會員資料表的狀態。這是準備讓管理者登入之後進入的網頁,畫面大概如下:


建立程式碼:
回到Default.aspx頁面,雙擊登入按鍵寫程式如下:

上述程式是依據GridView物件從資料庫帶出的資料,一一比對使用者在登入物件Login1寫入的帳密是否符合,如果都符合了就可以轉到適當的網頁,一般使用者可以到Default2.aspx,管理者則到Default3.aspx。Respone是回應的意思,Redirect就是讓網頁轉向新的網址。測試看看,如果亂寫會出現錯誤訊息。

此時還必須記住使用者的身分(程式碼紅色框線部分),原因是接下來要考慮所謂關閉後門的機制,雖然經過豋入頁可以順利到達目的網頁,但是不經過登入頁,直接打網址Default2.aspx或Default3.aspx以目前狀況也是可以進入的!如下示意圖,我們必須讓走後門的人嚐到閉門羹,因此必須有一個變數記載使用者是不是已經登入?或以甚麼身分登入?那就是程式碼中的Session("role")了。

在此,如果成功登入Session("role")可能是『管理者』或『一般』,如果沒登入成功則Session("role")根本不存在!Session變數是可以跨網頁存在的,但只專屬於一個使用者,不同使用者因為登入狀態不同,Session的內容可以不同。因此我們可以在進入第二與第三網頁之前用程式檢查Session("role")也就相當於一張通行證,而且是有權限差別的,管理者哪裡都能去,一般使用者只能到Default2.aspx。請在Default2.aspx的Page_Load事件寫程式:

就是如果Session("role")不存在(Nothing)就是未登入,應該強制轉回登入頁。
Default3.aspx的Page_Load事件程式稍有不同:

這個條件其實比較嚴格,一定要是以管理者身分登入才能看網頁,以一般身分登入後也無法進入的!
如果要顯示一些警告訊息,你也可以寫成這樣:

但是這樣寫時 Response.End就很重要了!這個指令代表中斷網頁傳輸,使用者因此只能看到Response.Write寫的警語,其他則是一片空白!如果忘了寫Response.End,網頁出現警語之後還是會完整呈現,那就失去關後門的意義了!

當然設計完成後用來帶入帳密資料的GridView不能讓使用者看到,否則就前功盡棄了!因此必須將此物件的Visible屬性設為False就是將它隱藏起來了!我們的VB程式因為是在伺服端執行的依舊可以取得GridView的資料,但是設定隱藏之後客戶端網頁就不會有這些資料了。