ASp.net中Froms驗證方式

 
微軟的ASP.NET提供了3種用戶驗證方式,即Windows驗證、窗體(Forms)驗證和護照驗證(Passport)驗證。
   
由於驗證方式各不相同,因而這3種驗證方式在使用範圍上也有很大的不同, Windows驗證方式只適用於放在受控環境裏的網站; 也就是說,更適合於企業內網(Intranet)。窗體認證特別適合佈置於互聯網的應用,而護照驗證方式適合於跨站之間的應用,用戶只用一個用戶名和密碼就可以訪問任何成員站,並且在註銷離開時,所有護照信息都會清除,你可以在公共場所放心的使用。
我們在編寫Web程序時,最多用到的便是窗體(Forms)驗證方式,而微軟提供了只要簡單的配置Web.config文件就可實現這種簡單的窗體(Forms)驗證。爲了能更好的使用窗體驗證,我對這種驗證方式進行了研究。

    

基於表單身份驗證的類的命名空間:System.Web.Security
常用的幾個類分別爲:
1.FormsAuthentication 
   作用:爲 Web 應用程序管理 Forms 身份驗證服務
2.FormsAuthenticationTicket
 作用:提供對票證的屬性和值的訪問,這些票證用於 Forms 身份驗證對用戶進行標識
3.FormsIdentity
 作用表示一個使用 Forms 身份驗證進行了身份驗證的用戶標識.(用戶身份)
4.FormsAuthenticationModule
作用:啓用 Forms 身份驗證的情況下設置 ASP.NET 應用程序用戶的標識
 
一、實現簡單的驗證方式
 
首先,我們可以通過配置Web.Config文件來實現簡單的驗證方式。先建立一個Web工程,然後在首頁放登錄控件。然後在這個工程下再建立一個目錄,在這個目錄下添加兩個Web頁面,設置成這個目錄下的頁面只有通過驗證後再能訪問。
在Default.aspx頁中,輸入用戶名和密碼,然後Click,如果密碼和用戶名正確,則通過驗證就能轉到新建目錄下的一個頁面上。如果沒有通過驗證,則不能訪問目錄下的頁面。代碼如下:
Void Logon_Click(object sender, EventArgs e)
{
   String UserName 
= UserEmail.Text;
   String UserPass 
= UserPass.Text;
  
   If(通過連接數據庫判斷用戶和密碼是否正確)
  {
 
//將經過身份驗證的用戶重定向回最初請求的 URL 或默認 URL
    FormsAuthentication.RedirectFromLoginPage(UserName, Persist.Checkd);
  
//這個函數是否建立Cookie:解決:建立Cookie
  Else
  {
   Msg.Text 
= Invalid credentials. Please try again.";
  }
}
 
 
 然後在建立的目錄下,新建一個Web.Config文件
<configuration>
      
<system.web>
          
<authorization>
          
<deny users="?" />   不充許沒經過身份驗證的用戶進行訪問
           
</authorization>
      
</system.web>
             
</configuration>
 
在這個Web.Config文件中,設置了這個目錄下所有文件的授權方式。這是一種URL授權。應用程序根據配置對匿名用戶進行檢查。URL授權在Web.config中的<authorization>區段內定義。
<authorization></authorization>區段中有兩個標記,標記<allow>定義了許的用戶、任務和操作,在<deny>標記中包含了不被充許的用戶、任務和操作。
例如: <allow users = “*”>
      <deny users = “?”>
    “*”
代表所有的用戶,“?”表示匿名(沒經過身份驗證的)用戶。
 
  在要目下的Web.Config中,我們同時要設置驗證方式是基於Forms的
<authentication mode="Forms">
   
<forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"></forms>
</authentication>
<authorization>
    
<allow users="*"/>
</authorization>
  
<forms>元素的有效屬性
Name: 用於身份驗證的Http Cookie的名稱。
LoginUrl:沒有通地驗證的用戶將要被重定向到的登錄頁面的URL.
Protection: Cookie數據的保護方法。
TimeOut: Cookie的過期時限,以分鐘爲單位。默認值爲30
Path:Path用於已發出Cookie的路徑。默認值爲”/”。
 
 
二、實現複雜的驗證方式(角色控制)
 
  構造GenericPrincipal 和 FormsIdentity 對象
GenericPrincipal : 表示一般用戶
FormsIdentity:表示一個使用 Forms 身份驗證進行了身份驗證的用戶標識
FormsIdentity類由 FormsAuthenticationModule在通過 Forms 身份驗證對用戶進行身份驗證時使用。使用從 Forms 身份驗證 Cookie 或 URL 解密的 FormsAuthenticationTicket創建一個 FormsIdentity的實例。然後,使用此 FormsIdentity類的新實例構造一個新的 GenericPrincipal 對象,該對象將設置爲當前 HttpContextUser屬性的值
  
在Global.asax文件中,添加事件Application_AuthenticateRequest代碼:
注:Application_AuthenticateRequest在這個事件中添加自定義身份驗證的代碼。
 
1、頁面請求時獲得cookie及角色值
using System.Web.Security;
using System.Security;
//這個事件用於頁面請求時獲得cookie及角色值
    protected void Application_AuthenticationRequest(object sender, EventArgs e)
   
{
        
//請求傳遞的Cookie集合中獲得窗體身份驗證Cookie
        
//FormsCookieName:獲取用於存儲Forms 身份驗證票證的Cookie 名稱
        
        
//FormsCookieName 用於引用存儲FormsAuthenticationTicket 信息的Cookie
        string cookiename = FormsAuthentication.FormsCookieName;    
        
        
//提供創建和操作各HTTP Cookie 的類型安全方法
        
//HttpCookie類獲取和設置各Cookie 的屬性
        
        HttpCookie cookie 
= Reauest.Cookies[cookiename];  /*從cookiename得到cookie*/

        
if (cookie == null)
            
return;
        
//從窗體身份驗證cookie中提取和解密身份驗證票據
        FormsAuthenticationTicket ticket = null;

        
try
        
{
            
//返回值:一個FormsAuthenticationTicket 對象
            ticket = FormsAuthentication.Decrypt(cookie.Value);  //cookie:加密的身份驗證票
        }

        
catch(Exception err)
        
{
            
return;
        }


        
if (ticket == null)
            
return;

        
//解析出用戶在最初對用戶進行身份驗證時附加到票上的管道分隔的角色名稱列表
        string[] roles = ticket.UserData.Split(new char[] '|' });


        
//創建一個FormsIdentity對象和一個GenericPrincipal對象。前一個對象從票名稱中
        
//獲得用戶名,後一個對象將此標識與用戶角色列表包含在一起
        FormsIdentity ident = new FormsIdentity(ticket);

        GenericPrincipal princ 
= new GenericPrincipal(ident, roles);
        HttpContext.Current.User 
= princ;
   }

  2、登錄時可以得到用戶信息以及是否已經登錄 

//驗證及得到用戶信息
    private void Page_Load(object sender, System.EventArgs e)
    
{
        FormsIdentity userIdentiy;
        FormsAuthenticationTicket objTecket;

        
if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
        
{
            userIdentiy 
= HttpContext.Current.User.Identity;
            objTecket 
= userIdentiy.Ticket;
            
//可以從Ticket中獲取用戶信息
        }

        
else
        
{
            Response.Write(
"<script>alert('您沒有登陸!');history.back()</script>");
            
//或者指向登錄頁面
            Response.Redirect("Login.aspx");
        }
 
}

 3、登錄時生成用戶票據

private string Authorization(string username, string password)
    
{
        
//用戶登錄驗證
        string ip = System.Web.HttpContext.Current.Request.UserHostAddress;
        
string name = username;
        
string pwd = password;

        
if (ValidatePwd(name, pwd) = true)  //數據庫驗證,代碼略
        {
            
//創建身份驗證票證
            FormsAuthenticationTicket ticker = new FormsAuthenticationTicket(1, name, DateTime.Now,
                                                DateTime.Now.AddMinutes(
30), false"");

            
string encryptTicket = FormsAuthentication.Encrypt(ticker);
            HttpCookie cookie 
= new HttpCookie(FormsAuthentication.FormsCookieName, encryptTicket);
            Reponse.AppendCookie(cookie);

            
//將用戶重定向到最初的請求頁面
            Response.Redirect(FormsAuthentication.GetRedirectUrl(name, false));

            
//Resonse.Redirect(FormsAuthentication.RedirectFromLoginPage(name, false));
            
//this.Session["UserName"] = username;
        }

        
else
        
{
            Response.Write(
"<script>alert('您的用戶名或密碼錯誤');</script>");
        }

    }

 

  解釋:

Context.User.Identity.IsAuthenticated

  Context:獲取與該頁關聯的 System.Web.HttpContext 對象

  User:爲當前 HTTP 請求獲取或設置安全信息

  Identity:獲取當前用戶的標識

  IsAuthenticated:獲取一個bool值,該值指示是否驗證了用戶

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章