[範例]ASP.NET使用Session驗證練習範例

網路上有網友詢問到使用Session作ASP.NET驗證,應該怎麼做比較好,小喵個人其實比較推薦使用ASP.NET驗證的機制(FormsAuthentication),建議可以看小喵的這一篇【學習ASP.NET 2.0會員機制三部曲】,不過既然網友問起,剛好最近有個小空檔,就來練習寫個範例。

緣起

網路上有網友詢問到使用Session作ASP.NET驗證,應該怎麼做比較好,小喵個人其實比較推薦使用ASP.NET驗證的機制(FormsAuthentication),建議可以看小喵的這一篇【學習ASP.NET 2.0會員機制三部曲】,不過既然網友問起,剛好最近有個小空檔,就來練習寫個範例。

 

範例說明

首先說明這個範例希望達到的

相關的程式下圖:

s0001

 

  1. 使用MasterPage套用一致的樣式
  2. 使用PageBase:
    1. 登入驗證程式碼寫在此
    2. 設定一個屬性,預設不做驗證,如果需要驗證,設定該屬性為True,將自動啟動驗證機制
  3. Default1.aspx設定為必須驗證才能瀏覽

 

 

 

相關程式碼:

MasterPage

首先建立MasterPage,相關的內容安排如下:



<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <link href="css/MasterStyle.css" rel="stylesheet" />
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <div id="divTitle" class="divMasterTitle">
                Title
                <div style="float:right;">
                    <asp:Label ID="lblUserID" runat="server" Text=""></asp:Label>,
                    <asp:LinkButton ID="lbtnLogout" runat="server" Visible="false">登出</asp:LinkButton>
                    <asp:LinkButton ID="lbtnLogin" runat="server">登入</asp:LinkButton>
                </div>
            </div>
            <div id="divLeft" class="divMasterLeft">Left</div>
            <div id="divRight" class="divMasterRight">
                Right
                <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                </asp:ContentPlaceHolder>
            </div>
        </div>
    </form>
</body>
</html>

基本上安排三個區塊:

  • 天:放Title, 登入後的使用者帳號,登入/登出按鈕
  • 左:保留
  • 右:放ContentPlaceHolder,未來與ContentPage結合

接著設定結合的css


    width:1000px;
    height:120px;
    background-color:skyblue;
    text-align:center;
}

.divMasterLeft{
    width:200px;
    height:600px;
    background-color:silver;
    text-align:left;
    float:left;
}

.divMasterRight{
    width:800px;
    background-color:white;
}

顏色的部份我沒有很講究,只有區分一下不同的顏色

 

接著是MasterPage的CodeFile


Partial Class MasterPage
    Inherits System.Web.UI.MasterPage

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        '判斷是否有登入
        If Session("IsLogined") = "Y" Then
            '****登入狀態時

            '顯示登入者帳號
            Me.lblUserID.Text = Session("UserID")
            '將登出的按鈕顯示出來
            Me.lbtnLogout.Visible = True
            '將登入的按鈕隱藏起來
            Me.lbtnLogin.Visible = False
        Else
            '****登出狀態時

            '隱藏登出的按鈕
            Me.lbtnLogout.Visible = False
            '顯示登入的按鈕
            Me.lbtnLogin.Visible = True
        End If
    End Sub

    Protected Sub lbtnLogout_Click(sender As Object, e As EventArgs) Handles lbtnLogout.Click
        '按下登出,導向到Logout.aspx
        Response.Redirect("~/Logout.aspx")
    End Sub

    Protected Sub lbtnLogin_Click(sender As Object, e As EventArgs) Handles lbtnLogin.Click
        '按下登入時
        '取得目前的網址
        Dim CurrentUrl As String = Server.UrlEncode(Request.RawUrl)
        '設定登入的網址+導回的網址
        Dim LoginUrl As String = "~/Login.aspx?RtnUrl=" & CurrentUrl
        '導向登入頁面
        Response.Redirect(LoginUrl)
    End Sub
End Class

 

 

 

 

PageBase

接著,撰寫登入驗證的相關程式碼,這邊特別撰寫在PageBase中,未來每一頁的繼承,本來繼承【System.Web.UI.Page】就改繼承【PageBase】就可以囉

以下是PageBase的相關程式碼:

Imports Microsoft.VisualBasic

Public Class PageBase
    '繼承本來每頁會繼承的System.Web.UI.Page
    Inherits System.Web.UI.Page

    '設定一個變數用來紀錄是否須登入驗證,預設不用
    Private m_LoginChk As Boolean = False

    ''' <summary>
    ''' 設定唯寫屬性LoginChk
    ''' </summary>
    ''' <value>傳入的LoginChk:True/False</value>
    ''' <remarks></remarks>
    Public WriteOnly Property LoginChk As Boolean
        Set(value As Boolean)
            m_LoginChk = value
            If m_LoginChk = True Then
                '如果傳入的是True,就呼叫ChkLogin()
                ChkLogin()
            End If
        End Set
    End Property

    ''' <summary>
    ''' 登入驗證
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ChkLogin()
        '如果Session("isLogined")不是Y→未登入
        If Session("isLogined") <> "Y" Then
            '***未登入

            '清除所有的Session
            Session.Abandon()
            '取得目前的Url
            Dim CurrentUrl As String = Server.UrlEncode(Request.RawUrl)
            '導向到Login.aspx,並設定登入成功後,導回的網址
            Response.Redirect("~/Login.aspx?RtnUrl=" & CurrentUrl)
        End If
    End Sub

End Class

 

Login.aspx

登入的頁面,這裡畫面簡單拉Login控制項來用,後端驗證則是暫時寫死帳號topcat,密碼abc123才會登入成功

Login.aspx



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Login ID="Login1" runat="server">
</asp:Login>
</asp:Content>

CodeFile:Login.aspx.vb


Partial Class Login
    Inherits System.Web.UI.Page

    Protected Sub Login1_Authenticate(sender As Object, e As AuthenticateEventArgs) Handles Login1.Authenticate
        '帳號密碼驗證,這裡實際請改寫成自己的資料庫驗證
        If Me.Login1.UserName = "topcat" And Me.Login1.Password = "abc123" Then
            '***驗證成功
            '紀錄登入者帳號
            Session("UserId") = Me.Login1.UserName
            '設定登入驗證的Session
            Session("isLogined") = "Y"
            '取得轉回的網址
            Dim RtnURL As String = Request.QueryString("RtnUrl")
            '如果沒有轉回的網址,轉回網址就是首頁
            If RtnURL = "" Then
                RtnURL = "~/Default.aspx"
            End If
            '轉回
            Response.Redirect(RtnURL)
        End If
    End Sub
End Class

 

 

 

 

 

 

 

測試頁面:

接著,安排一些頁面來測試

  • Default.aspx:首頁,不需登入即可瀏覽
  • Default1.aspx:須登入才能瀏覽
  • Default2.aspx:不需登入即可瀏覽

 

首先是首頁,內容沒什麼特別,CodeFile也不用特別撰寫(記得嗎?預設是免驗證)

Default.aspx



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    Default.aspx
</asp:Content>

Default.aspx.vb


Partial Class _Default
    Inherits System.Web.UI.Page

End Class

 

 

接著,重點~必須登入才能瀏覽

Default1.aspx : 畫面沒有什麼特別



<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    登入才能瀏覽
</asp:Content>

Default1.aspx.vb : 簡單的兩行,就能讓這頁面必須驗證


Partial Class Default1
    'Inherits System.Web.UI.Page
    '繼承,改繼承PageBase
    Inherits PageBase

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        '設定要登入才能瀏覽
        Me.LoginChk = True
    End Sub
End Class

直接瀏覽此頁面,會立即被導向到Login.aspx中進行登入,登入完成,會自動的導回此頁

 

Default2.aspx與Default.aspx幾乎相同,就不再貼程式碼

 

末記

這篇是練習使用Session的方式驗證是否登入,搭配PageBase,讓需要登入驗證的畫面,只需要兩行就能使得該頁面必須登入驗證才能瀏覽。不過小喵還是要強調,雖然這樣的程式碼不多,不過比起使用ASP.NET驗證的方式還是小複雜了點,小喵還是喜歡使用ASP.NET驗證的方式(FormsAuthentication),幾乎不必撰寫特別的程式碼,就可以做到需要驗證就自動轉入登入畫面,驗證後自動轉回本來瀏覽的畫面,可以透過Web.Config來設定權限(是否需要驗證),也可搭配Login, LoginStatus, LoginName, LoginView等控制項使用。

這篇的練習到此,提供大家參考囉

^_^

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6)