緣起:
ASP.NET 2.0有許多增加的功能。其中有關於Login控制項的部份,可以粉神奇的,透過一些設定的方式,就可以不寫任何一句程式碼的情況下做到會員的存取、狀態的顯示、會員密碼的查詢、會員的建立等等。這個機制會在您的ASP.NET的專案中的App_Data中建立一個MDF的SQL資料庫,並且將使用者的相關資料建立在其中。這對於剛開始接觸ASP.NET的使用者無疑是一個粉好用的方式。
然而,我們可能需要用自己的資料庫來管理自己的會員資料,並且可能會與其他的相關資料做關聯處理、甚至會有自己的一套畫面授權機制。如果是這樣的情況,當然沒有辦法在一行程式都不用寫的狀況下就做到這樣。在以往沒有這些Login Controls控制項(Login, LoginView, LoginStatus, LoginName, PasswordRecovery, ChangePassword, CreateUserWizard )的情況下,每一種都需要使用許多的控制項、許多的程式碼,並且搭配Session的機制才能夠達成這樣的目的。然而在使用VS2005的今天,放著這些控制項不去用,卻又覺得浪費了些。那麼要怎麼來使用這些的控制項,卻又可以存取自己的資料庫呢?
設定驗證機制:
首先,在準備好自己的使用者資料表、資料庫後,我們要使用Login Control來登入系統,需要先將ASP.NET中的驗證機制改為使用【Forms】的方式(預設是【Windows】的驗證機制)
開啟您專案中的Web.Config,找到以下這個項目,將authentication的Mode改為Forms,並且設定登入的畫面程式為Login.aspx(意指未來登入式透過這個畫面來執行)
<authentication mode="Forms">
<forms loginUrl="Login.aspx"/>
</authentication>
設定登入畫面:
接著,來設定登入的畫面,首先,AddNewItem,增加一個Login.aspx的WebForm,接著在畫面中,先安排一個LoginView,然後利用SmartTag,先將模式設定為AnonymousTemplate,此時再拉一個Login放入LoginView中,接著,透過SmartTage將模式切換為LoggedInTemplate,並在LoginView中設定Hello,後面放一個LoginName,接著換行後然,在後面接著放入一個LoginStatus用來登入後,顯示登出。切入Code模式如下
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<asp:Login ID="Login1" runat="server" />
<asp:Label ID="lblErrMsg" runat="server" ForeColor="Red" />
</AnonymousTemplate>
<LoggedInTemplate>
Hello,<asp:LoginName ID="LoginName1" runat="server" />
<asp:LoginStatus ID="LoginStatus1" runat="server" LoginText="" LogoutText="登出" />
</LoggedInTemplate>
</asp:LoginView>
撰寫Login相關程式
設定好畫面後,接著將LoginView的模式切回AnonymousTemplate,然後雙擊Login,撰寫如下程式:
Protected Sub Login1_Authenticate() Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
Try
'呼叫檢查帳號密碼程式,成功會傳回True
If ChkLogin(Login1.UserName, Login1.Password) Then
'執行FormsAuthentication.RedirectFromLoginPage,並且將是否記住帳號一併處理
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet)
Else
Throw New Exception("登入失敗")
End If
Catch ex As Exception
lblErrMsg.Text = ex.Message
End Try
End Sub
以往我們在紀錄是否登入,以及登入的使用者,經常會透過Session的方式來記錄登入的狀態與登入的使用者,但是在VS2005的機制中,卻是透過FormsAuthentication.RedirectFromLoginPage來處理登入狀態維護,不再是使用Session的方式,而是透過Cookie的方式來處理。那麼應該如何來判斷是否已經登入過呢,可以透過Page.User.Identity.Name.ToString是否有資料來做判斷。事實上,LoginName這個控制項就是把Page.User.Identity.Name.ToString顯示出來
檢查資料庫使用者:
接著就來看如何從資料庫中驗證使用者是否存在的相關程式碼Function ChkLogin()
Public Function ChkLogin(ByVal UserName As String, ByVal UserPassword As String) As Boolean
'檢查帳號密碼程式, 成功會傳回True
Dim conn As New SqlConnection '宣告SqlConnection並實體化
Dim cmmd As New SqlCommand '宣告SqlCommand並實體化
Dim pmtUserName As New SqlParameter '宣告sqlParameter並實體化
Dim pmtUserPassword As New SqlParameter '宣告sqlParameter並實體化
Dim strSQL As String
Dim dr As SqlDataReader
Try
'設定Connection String並且開啟Connection
'conn.ConnectionString = "Data Source=IBM-MJ8JNYV1URH\SQLEXPRESS; Initial Catalog=DBBD;User ID=sa;Password=xxxxxxxx"
conn.ConnectionString = WebConfigurationManager.ConnectionStrings("myDB").ConnectionString
conn.Open()
'設定讀取資料的SQL語法
strSQL = "SELECT UserId FROM TBBDUser WHERE UserId = @UserName And Passwd = @Passwd"
cmmd.Connection = conn
cmmd.CommandText = strSQL
'設定Parameter名稱,並將值傳入
pmtUserName.ParameterName = "@UserName"
pmtUserName.Value = UserName
pmtUserPassword.ParameterName = "@Passwd"
pmtUserPassword.Value = UserPassword
'將Parameter加入SqlCommand中
cmmd.Parameters.Add(pmtUserName)
cmmd.Parameters.Add(pmtUserPassword)
'執行讀取並將結果給予DataReader
dr = cmmd.ExecuteReader()
If dr.HasRows Then
'判斷有資料
ChkLogin = True
Else
'發起錯誤
Throw New Exception("登入失敗!!")
End If
Catch ex As Exception
ChkLogin = False
lblErrMsg.Text = ex.Message
Finally
pmtUserName = Nothing
pmtUserPassword = Nothing
dr = Nothing
cmmd = Nothing
conn = Nothing
End Try
End Function
密碼加密安全補充:
原來使用ASP.NET的機制,密碼是有加密過的,目前小喵這個部份省略了,各位實際在運用的時候,請適當的將密碼的不份加密後再加以驗證,這樣會比較安全些。
^_^a
你這對初學者有幫助.但如果要再進一步來說.你要知道權限的運作原理及資料庫安全性Schema的規劃.
你教的都是一些ASP.NET的內建元件.但這些元件可能因版本的不一樣,比如說ASP.NET 3.x,4.x...
而且你後端來源可能從其他的服務.或者是你以後可能寫WindowsForm,MobilePhone,WebServer.或什麼雲端技術...這裡面都會用到安全機制.
所以你可以Post一篇有關於安全機制,包含資料端安全Schema的規劃.前端元件設計的文章.