ASP.NET安全問題--Forms驗證(后篇)--實戰篇

作者: 小洋  來源: 博客園  發布時間: 2009-06-02 10:03  閱讀: 2884 次  推薦: 1   原文鏈接   [收藏]  
摘要:通過之前的幾篇文章,相信大家對Forms驗證有了一定的了解,也清楚了Identity,IPrincipal,票據等概念。之前的文站一直沒有把驗證和數據庫聯系起來,本篇就從這方面講解,用代碼來演示!而且代碼中也涉及到一些角色授權的問題,為之后的文章伏筆!

       驗證流程講述

       我們首先假設一個場景:用戶現在已經打開了我們的首頁Default.aspx,但是有些資源只能是登錄用戶才可以看到的,那么如果這個用戶想要查看這些資源,那么他就要登錄。而且這個用戶已經有了一個帳號。(我們本篇主要的話題是身份驗證,至于創建用戶賬戶是怎么創建的,我們不關心,方法很多,如直接一個數據庫插入就行了!)
 
       我們現在就把我們的一些流程說下:
       1.用戶登錄,在輸入框中輸入用戶名和密碼信息
       2.點擊登錄按鈕后,到數據庫中查詢該用戶是否存在
       3 如果存在,服務器端代碼就創建一個身份驗證的票據,保存在cookie中,然后發送到客戶端的瀏覽器
       4.用戶已經有了驗證的cookie,那么就頁面就跳轉到用戶之前請求的頁面

       數據庫準備

       那么下面我們就開始詳細講述:
       首先,我們我們肯定要先得創建一個數據庫,我們就取名為Login表,創建一個用戶信息表,我們在在表中建立三個字段UserName,UserPassword,UserRole(大家可以創建更多字段,我這里只是演示,大家可以擴展的).  至于表中的數據,大家自己隨便插入幾條!
 
       代碼編寫
       因為我們常常要驗證用戶,所以我們把驗證用戶的代碼寫成一個方法放在App_Code目錄下的Helpers.cs類中
       代碼如下:

驗證代碼
      
    SqlConnection con 
= new SqlConnection();
    con.ConnectionString 
=
        ConfigurationManager.ConnectionStrings[“MyConnectionString”].ConnectionString;

    SqlCommand com 
= new SqlCommand();
    com.Connection 
= con;
    com.CommandText 
= “Select Count(*) From Users Where Username=@Username and UserPassword=@Password”;

    com.Parameters.AddWithValue(“@Username”, username);
    com.Parameters.AddWithValue(“@Password”, password);
    con.Open();

    
int cnt = (int)com.ExecuteScalar();
    con.Close();

    
return (cnt > 0);
}

      然后我們就創建一個登錄的頁面Login.aspx,在頁面上面放入兩個TextBox,分別用來供用戶輸入用戶名和密碼。

      放上一個按鈕,用來登錄。

      回到Helpers.cs中,我再添加一個方法,來獲取用戶的角色:

Code

      為了啟動Forms驗證,我們還得到web.config文件中配置,如下:

<authentication mode=”Forms”>
    
=”.mycookie” path=”/” loginUrl=”Login.aspx” protection=”All”
timeout=”40” />
authentication>

      并且不允許匿名用戶訪問我們的網站 :

<authorization>
  <deny users=”?”/>
>

      然后我們就開始在Login.aspx的登錄按鈕下面寫代碼了:

      基本思想如下:

      1.驗證用戶是否存在,

      2.如果存在,同時獲取用戶的角色

      3.創建身份驗證票據和cookie,并且發送到客戶端的瀏覽器中

     代碼都加了注釋,通過之前的基礎,相信大家可以對下面的代碼沒有問題。

Code

      好了,現在如果我們正確的輸入用戶名和密碼,那么我們的瀏覽器中就有了身份驗證的cookie了,現在我們的頁面就要馬上從原來的Login.aspx轉向到Default.aspx頁面了,我們現在把這個轉向的過程在頭腦中把它慢速化,因為我們要分析這個過程。

       在Login.aspx轉向到Default.aspx頁面跳轉的過程中,其實我們在請求Default.aspx頁面,這個我們之前請求的過程沒有任何的區別,也是一樣要經歷ASP.NET的一些生命周期,但是這次我們的瀏覽器中已經有了身份驗證的cookie,ASP.NET運行時在處理,在處理Application_AuthenticateRequest事件時就要解析我們的cookie了。其實在之前我們登錄之前,在這個事件代碼中也解析了cookie的,只是那時候沒有找到cookie而以。

       Application_AuthenticateRequest事件的代碼中,其實就是解析cookie,然后把用戶的身份標識,并且把用戶的身份信息保存起來:

Code

      我們看到最后一行代碼:app.Context.User = user;,把用戶的身份以及角色信息保存在了User屬性中。

      我們就可以在頁面中通過如下方法判斷用戶是否登錄了:

 if (Page.User.Identity.IsAuthenticated)
  {
                        
//
  }

      用下面的方法判斷用戶是否屬于某個角色:

if (Page.User.IsInRole("Admin")
{
     
//
}

      其實這個我們之前講過了的Identity,IPrincipal概念有關,不清楚的可以看看之前的文章!

      代碼到這里,今天也寫完了,有關身份驗證的問題就要講完了,還差一個問題沒有講述:自定義身份驗證以及開發自定義的HttpModule.

      之后的的文章將講述授權的問題。

1
0
 
標簽:ASP.NET
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()