1. 程式人生 > >ASp.net中Froms驗證方式

ASp.net中Froms驗證方式

private all using path 沒有 side 得到 附加 .get

微軟的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 對象,該對象將設置為當前 HttpContext的 User屬性的值 在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值,該值指示是否驗證了用戶

ASp.net中Froms驗證方式