topcat 姍舞之間的極度凝聚

分享...是知識累積的開始... Microsoft ASP/ASP.NET MVP 2006~2010

文章標籤


more tags...

語言學習

翻譯工具


得獎Link






論壇/討論區:





目前活動連結:


修練大會文章總攬:

VS2010
Office2010

計數器與網站工具


Free Page Rank Tool

最新回應

ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

緣起:

        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,找到以下這個項目,將authenticationMode改為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" /> 
                <br /> 
                <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

  • 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
  • 如果您覺得此篇對您或者對大家有幫助,敬請按一下【推薦】,感恩!!  ^_^
推到 Plurk!

Microsoft MVP
Microsoft MVP ASP/ASP.NET


topcat
Blog:http://www.dotblogs.com.tw/topcat
 

2008/3/5 14:45| 閱讀數 : 30480 | 我要推薦 | 89 Comments | 文章分類: (.NET)ASP.NET ASP.NET權限控管 訂閱


關連文章

回應

  • WAWA 2008/4/17 下午 05:04 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    小貓大 為何
    我照網頁上的來測式
    他都會寫說 login1 跟 lblErrMsg
    沒有定義- -
  • topcat 2008/4/18 上午 08:40 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    這是因為放在LoginView裡面,造成Login1,lblMsg物件變成物件中的物件。物件中的物件要取得,必須使用FindControl

  • Penny Fox 2008/5/2 下午 02:17 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    呃 請問一下,如果照這樣設計的話
    其他頁面還是得手動寫一個判斷Page.User.Identity.Name.ToString() 是否有值,如果沒有的話就Redirect(login.aspx)
    這樣是嗎?
  • topcat 2008/5/5 下午 06:28 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to Penny Fox :
    不是耶

    基本上是根據您Web應用程式的虛擬目錄來設定

    您可以設定某個目錄以下需要驗證才能瀏覽,某個目錄以下允許匿名存取。而這些設定全部設定在Web.Config中。

    如果設定為拒絕匿名存取,那麼當您還沒有登入的時候,他就會自動導到登入的畫面,這些動作都不需要您再用程式去控制,因為他是自動啟動的。找個時間小喵再把這些這定與概念錄製一下

    ^_^

  • amy 2008/5/18 下午 07:52 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    請問你的檢查資料庫使用者那段是寫在哪啊?
  • topcat 2008/5/18 下午 09:50 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to amy :
    在自訂的Function ChkLogin中

  • amy 2008/5/18 下午 10:02 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    是在app_code新增的嗎?
  • topcat 2008/5/19 上午 08:51 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to amy :

    基本上,有重複使用必較或者可能性的,小喵才會寫在App_Code寫成類別,這個部分並沒有這個必要性或可能性,所以小喵只要寫在此畫面中的CodeFile裡面即可。程式碼在文章中就有,您再看仔細應該就可以發現。

  • 靜宜kk 2008/7/13 下午 04:33 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    您好 我想請問一下 我最近也用asp.net 2.0寫了一個登入系統 也是用loginview結合login物件下去寫的 可是我在測試的時候輸入的帳號和密碼是正確的卻沒辦法 轉換到登入後的頁面 請問您有過這種狀況嗎? 我的系統是架設在IIS上面的 並且後端資料庫是連結到外部電腦的伺服器
  • topcat 2008/7/14 下午 01:28 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to 靜宜kk : 
    小喵猜測你沒有指定哪些是拒絕匿名存取,也沒有指定defaultUrl
    建議您參考以下這篇了解一下ASP.NET的驗證與授權機制http://www.dotblogs.com.tw/topcat/archive/2008/06/02/4201.aspx

     

  • MOS 2008/8/12 上午 11:44 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    請教一下topcat大大
    在進行 ChkLogin 這個函數時
    我跑到第18行 conn.Open() 時就直接跳到第46行的
    Catch ex As Exception 而導致登入失敗
    我只改了連線自串 如下 cnn.ConnectionString = "Data Source=MS2003;Initial Catalog=deb;User ID=DEB"
    請問 大大 有哪個地方是我沒有注意到的嗎
  • 蕃茄醬 2008/8/27 上午 08:28 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    請問貓大用這個方式的話腳色管理的機制要如果設定呢?這個方式只有驗証機制而已說
  • topcat 2008/8/27 上午 09:41 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to 蕃茄醬 :
    是....
    確實小喵自己評估小喵的環境狀況,驗證採取這樣的方式,然後角色的管理小喵自己寫成是來處理

    請參考這一系列的文章。文章還沒完成,敬請期待。

    http://www.dotblogs.com.tw/topcat/category/1499.aspx

     

  • Wei Wei 2008/9/1 下午 06:22 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    喵大大

    我也有蕃茄醬相同的問題。

    關於那一系列文章
    登入結合自己的資料庫 <- 明白
    TreeView樹狀結構結合資料庫 <- 看了很久,還是不太明白

    登入狀態維護可用
    FormsAuthentication.RedirectFromLoginPage來處理
    其實有什麼簡單的方法順便設定user 的 角色
    這樣就可以用LoginView,和sitemap中角色的控制
  • topcat 2008/9/2 上午 08:13 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to Wei Wei :
    小喵的權限控管是比較複雜,如果您知道AD的權限管理,那麼大概就可以想像的到他的規則。

    而本來的角色的授權方式,他的模式在小喵評估後,不適合小喵這樣複雜的使用環境,因此小喵才會自己動手做屬於自己的權限控管機制,只用了本來驗證授權機制中【驗證】的部分。

    >>TreeView樹狀結構結合資料庫 <- 看了很久,還是不太明白
    這部分可能需要您去實際做一下【ASP.NET 2.0 使用資料表動態產生TreeView的樹狀結構】這篇,因為小喵最終要呈現的就是樹狀的畫面目錄並結合權限控管。

    ^_^

  • Wei Wei 2008/9/2 下午 07:01 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    喵大大,

    抱歉我不懂AD的權限管理,是個初學者

    我不想用它的角色管理機制,像這篇文章的登入功能,是讀取自己的使用者資料庫
    請問在本來驗證授權機制中,除了【驗證】的部分外,可否再回傳用戶的角色

    不太會表達,希望你明白我的問題
  • topcat 2008/9/3 上午 08:08 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to Wei Wei :
    您要的方式小喵大致上了解,不過因為小喵覺得這樣的方式並不符合小喵使用,因此小喵也沒有去測試,真是不好意思ㄋㄟ

    ^_^a

  • newnew 2008/10/8 上午 01:25 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    <authentication mode="Forms">中可設定timeout的時間,指的是user login後,可使用的總時間, 還是login後,如果user都沒有任何操作, 只是將畫面一直停留在某page時, 時間一到,就會要求使用者重新login呢?
  • topcat 2008/10/9 下午 03:44 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    >>還是login後,如果user都沒有任何操作, 只是將畫面一直停留在某page時, 時間一到,就會要求使用者重新login呢?

    是的,就是這個意思。

    不過小喵要提醒一下,他與Session Timeout  不同唷

    ^_^

    因此可能Session已經Timeout了,可是帳號卻還活著。

  • newnew 2008/10/11 下午 08:47 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to topcat :
    謝謝您的回覆,
    那session的timeout的時間,該如何設定?
    預設是多久?
    IIS是否需要設定?
    一般session的timeout與驗證的timeout是不是會設一致?

  • 御痕星語 2008/10/12 下午 09:16 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    小喵大

    因為自己是網頁的初學者

    所以有用到頁框(分成三塊左邊、右上、右下)

    那如果需要登入之後

    需要右上的網頁跳到另一個網頁的話

    那我該怎麼做呢?

    我在Login1_Authenticate裡面測試

    加上Response.write的指令

    登入之後也都沒有反應耶@@
  • 初學者 2008/10/13 下午 01:07 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    請問我照上述做到撰寫Login相關程式時,也加了
    Dim Login1 As WebControls.Login
    Login1 = Me.LoginView1.FindControl("Login1")

    Dim lblErrMsg As Label
    lblErrMsg = LoginView1.FindControl("lblErrMsg")

    他還會說ChkLogin未宣告,那ChkLogin該如何宣告呢?
  • topcat 2008/10/14 上午 07:55 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to 御痕星語 :
    建議您使用ASP.NET中的新功能(2.0以後)--MasterPage,除非必要才使用frame的方式

    ^_^

  • topcat 2008/10/14 上午 07:57 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to 初學者 :
    您再看仔細一下,ChkLogin是個Function唷

  • nwalker 2008/10/14 上午 10:54 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    不好意思,想請問小喵大
    是否能開個小區域文章
    方便我們這些新手詢問一些問題?
    因為小弟再MOSS2007使用者設定上出了點問題
    基礎的都學不好,小弟不太敢深入學習
    網路上推薦來此處問,所以可能要叨擾一下嚕
  • 御痕星語 2008/10/15 上午 01:42 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to topcat :

    之前也爬過文

    大家都不建議使用框架

    可是我畢業專題只剩下一個月就要交了

    目前沒有時間再去換成Master Page了耶

    不知道小喵大有沒有辦法幫我解決我問的那個問題

    真的很感謝您。
  • topcat 2008/10/15 下午 03:28 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to nwalker :
    首先感謝您的駐足瀏覽....
    由於這個Blog非自己寫程式架設,因此目前沒有討論區的功能可以使用。建議您先到藍色小舖(http://www.blueshop.com.tw)去發問,小喵會不定期的在那裏,小舖裡也有很多大大可以幫忙^_^

    感謝您的建議,我會與點部落的人員討論一下應該如何做相關的服務。

    ^_^

  • topcat 2008/10/15 下午 03:32 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to 御痕星語 :
    您的問題小喵大致上想到可以在驗證完成後,寫入一個Session,然後在您想要做處理的右上角那個aspx中,在Page_Load事件中檢查該Session是否有東西,如果有代表有見證通過,再配合Response.Redirect的方式轉到您想要的那一個aspx中

    不過小喵還是要說一下,這樣的方式比較麻煩,如果未來不是為了趕專案報告,還是用MasterPage比較容易處理,也比較恰當些

    以上的方向提供您參考

    ^_^

  • nwalker 2008/10/16 上午 09:15 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    不好意思,再次詢問
    藍色小鋪哪個區域屬於MOSS2007?
    小弟比較少逛這種論壇,所以一時間找不太到專區
    煩請topcat兄幫小弟指點一下^^
  • topcat 2008/10/16 上午 09:51 回覆

    # re: ASP.NET 2.0如何使用Login來存取自己的使用者資料庫

    to nwalker :
    如果跟程式撰寫相關的,您可以在ASP.NET區問

    另外如果是其他MOS2007的部分,那您可以到TechNet論壇那邊

    http://forums.microsoft.com/TechNet-CHT/ShowForum.aspx?ForumID=1047&SiteID=23

     

標題 *
名稱 *
Email (將不會被顯示)
Url
回應
登入後使用進階評論
Please add 1 and 8 and type the answer here: