關於進行Asp.net窗體驗證的過程說明

   開發asp.net 程序時最常用的驗證模式就是基於窗體的身份驗證模式,結合global.asawebconfig可以快速實現此種機制。籠統的說,該過程是先建一個文件夾,然後把要保護的頁面放進去,接着設置一下web,config,這樣就完成了保護。如果你要訪問這個文件夾,就會被強制轉到預先設定的登錄頁面,你填上正確的用戶名和密碼,提交,系統驗證後,就把你的登陸信息寫到cookie裏面,這樣你再去訪問那個文件夾,就可以進去了,因爲你的登陸憑證已經保存到cookie裏面了。
    先要建一個asp.net應用程序,這裏面至少要有一個登錄用的頁面,然後修改你的根目錄下的web.config,把驗證那一塊改成Forms驗證模式。
 <authentication mode="Forms">
      
<forms loginUrl="Login.aspx" />
 
</authentication>
 
<authorization>
     
<deny users="?" />
 
</authorization>
     接下來在要保護的文件夾裏放一個web.config,要注意的是,這個子文件夾裏的web.config的實際內容不能像根目錄下的那個一樣多,否則就會出現配置錯誤,提示在應用程序級別以外使用註冊爲 allowDefinition='MachineToApplication' 的節是錯誤的。導致該錯誤的原因可能是在 IIS 中沒有將虛擬目錄作爲應用程序進行配置。具體應該怎麼做我也不清楚,總之這個web.config只要有下面的內容就ok了。
   
<configuration>
  
<system.web>
    
<authorization>
     
<!--設置准許訪問此文件夾的角色和拒絕的角色,這裏准許管理員,老師訪問,拒絕學生訪問-->
       
<allow roles="admin" />
       
<allow roles="teacher" />
       
<deny roles="student" />
       
<!--前提是拒絕匿名用戶!-->
       
<deny users="?" />
    
</authorization>
 
</system.web>
</configuration>
  當然也可以在頂層web.config文件中完成所有的url授權,而不是把它們分在各自目錄下的web,config文件中。asp.net也支持這種做法。下面這個web,config文件,放在應用程序根目錄下。
 如下:此設置是保護admin文件夾下的內容,拒絕匿名用戶訪問
 
<location path="admin">
  
<system.web>
   
<authorization>
     
<deny users="?"></deny>
   
</authorization>
   
</system.web>
</location>
   好了,設置完了,下面就開始爲我們的窗體驗證寫代碼了
   有兩種方式,第一種,當網站的用戶不是很多的時候,可以把用戶和密碼放到web.config裏。辦法就是在根目錄下的web.config文件中加入一個credentials節,裏面寫上用戶名和密碼,這個是包含在forms節裏面的。
   如下所示:
<authentication mode="Forms" >
   
<forms loginUrl="login.aspx">
     
<credentials passwordFormat="Clear">
      
<user name="admin" password="admin"/>
     
</credentials>
   
</forms>
</authentication>
   在此種情況下  配合使用System.Web.Security.FormsAuthentication.Authenticate(string name,string password)驗證credentials節中指定的用戶名和密碼,存在就返回true。


  下面着重介紹第二種方法,通過數據庫讀取用戶名密碼進行驗證。
    1:首先在數據庫裏建立三張表: Users(UserID,UserName,UserPwd)---存放用戶信息
                              Roles(RoleID,RoleName)------存放角色名稱
                              User_Role(UserID,RoleID)-----用戶和角色的中間表,使頭兩張表成爲多對多關係

    2:然後在登陸頁面的登陸按鈕點擊事件中加入如下邏輯
 
if (Page.IsValid) 
       
{
            
if(Users.Authenticate(txtUsername.Text, txtPassword.Text))//數據庫驗證方法,代碼略
            {
                 
//驗證後導向初始頁
                   FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, chkRemember.Checked ;
               }

        }
    在此也可以用 FormsAuthentication.SetAuthCookie(email.Text, RememberCheckbox.Checked);該方法不進行頁面導向,而是停留在本頁,然後由自己選擇導向的頁面。

    3:然後就要用到global.asax文件下的Application_AuthenticateRequest事件了,此事件在每次訪問aspx文件都會觸發。
在其中加入如下代碼,功能見註釋:
   
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        
{
            
            
if (Request.IsAuthenticated == true//如果驗證了用戶,則爲 true,否則爲 false
            {  
                String[] roles;
                
// 首次登陸,還沒有存入角色cookies
                if ((Request.Cookies["userlroles"== null|| (Request.Cookies["userlroles"].Value == ""))    
                
{
                    
// 此時調用方法,訪問數據庫中的記錄獲得用戶角色,並存入cookies
                    roles =(String[]) Users.GetRoles(User.Identity.Name).ToArray(typeof(String));
                    String roleStr 
= "";
                    
foreach (String role in roles)     //一個用戶會有多種角色,以一個字符串表示,用;隔開
                    {
                        roleStr 
+= role;
                        roleStr 
+= ";";
                    }

                    
//創建cookies票據
                    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        
1,                              //版本
                        Context.User.Identity.Name,     //登陸時候存入的標識用戶的用戶名
                        DateTime.Now,                   // 發佈時間
                        DateTime.Now.AddHours(1),       // 過期時間
                        false,                          // 是否持久
                        roleStr                         // 角色字符串
                        );

                    
// 加密票劇
                    String cookieStr = FormsAuthentication.Encrypt(ticket);
                    
//發送到客戶端,起名userroles
                    Response.Cookies["userroles"].Value = cookieStr;//必須加密
                    Response.Cookies["userroles"].Path = "/";
                    Response.Cookies[
"userroles"].Expires = DateTime.Now.AddMinutes(1);
                }

              
else 
              
{
                    
// 已存在,讀取,解密
         FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies["userroles"].Value);
                    
//把角色字符添加到list裏
                 ArrayList userRoles = new ArrayList();
               
foreach (String role in ticket.UserData.Split( new char[] {';'} )) 
               
{
                    userRoles.Add(role);
                 }

                 roles 
= (String[]) userRoles.ToArray(typeof(String));
                }

                
// 把此用戶的角色存到內存中,可以運用User.IsInRole()方法進行檢驗用戶角色
                
// 也可以使用實現IPrincipal接口的類,自定義賦值給Context.User
                Context.User= new GenericPrincipal(Context.User.Identity, roles);
               }

        }
   4:然後添加讀取驗證用戶是否存在的訪問數據庫代碼,和獲得用戶角色的代碼。
      詳細碼略,這裏主要爭對三張表寫出獲得用戶角色的存儲過程
    
CREATE PROCEDURE User_GetUserRolesByUsername 
(
    @Username  nvarchar(
50)
)
AS
select Roles.RoleName
from Roles
join Users on Users.Username
=@Username
join User_Role on User_Role.UserID
=Users.UserID
where Roles.RoleID
=User_Role.RoleID
GO
   至此,我們就完成了一般性的asp.net窗體驗證的功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章