1.使用Forms驗證存儲用戶自定義信息
Forms驗證在內(nèi)部的機制為把用戶數(shù)據(jù)加密后保存在一個基于cookie的票據(jù)FormsAuthenticationTicket中,因為是經(jīng)過特殊加密的,所以應該來說是比較安全的。而.net除了用這個票據(jù)存放自己的信息外,還留了一個地給用戶自由支配,這就是現(xiàn)在要說的UserData。
UserData可以用來存儲string類型的信息,并且也享受Forms驗證提供的加密保護,當我們需要這些信息時,也可以通過簡單的get方法得到,兼顧了安全性和易用性,用來保存一些必須的敏感信息還是很有用的。
下面來看怎么使用UserData,然后會給出一個實際使用的例子。
//創(chuàng)建一個新的票據(jù),將客戶ip記入ticket的userdata FormsAuthenticationTicket ticket=new FormsAuthenticationTicket( 1,userName.Text,DateTime.Now,DateTime.Now.AddMinutes(30), false,Request.UserHostAddress); //將票據(jù)加密 string authTicket=FormsAuthentication.Encrypt(ticket); //將加密后的票據(jù)保存為cookie HttpCookie coo=new HttpCookie(FormsAuthentication.FormsCookieName,authTicket); //使用加入了userdata的新cookie Response.Cookies.Add(coo);
下面是FormsAuthenticationTicket構造函數(shù)的重載之一的方法簽名 public FormsAuthenticationTicket( int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData );
參數(shù) version 版本號。 name 與身份驗證票關聯(lián)的用戶名。 issueDate Cookie 的發(fā)出時間。 expiration Cookie 的到期日期。 isPersistent 如果 Cookie 是持久的,為 true;否則為 false。 userData 將存儲在 Cookie 中的用戶定義數(shù)據(jù)
使用userdata也很簡單,F(xiàn)ormsIdentity的Ticket屬性就提供了對當前票據(jù)的訪問,獲得票據(jù)后就可以用UserData屬性訪問保存的信息,當然是經(jīng)過解密的。 ((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData
下面是一個具體的應用。
由于Forms驗證是通過cookie來進行的,它需要傳遞一個票據(jù)來進行工作。雖然票據(jù)是加密的,里面的內(nèi)容不可見,但這并不能阻止別人用一個假冒的身份使用票據(jù)(就像我們可以拿別人的鑰匙去開別人的鎖),比較常見的就是不同ip的用戶在不安全通道截獲了這個票據(jù),然后使用它進行一些安全范圍外的活動。
解決這個問題的辦法之一就是使用SSL來傳遞信息。
但是如果不能使用SSL呢?我們可以判斷ip和票據(jù)是否匹配,如果發(fā)出請求的ip是初次產(chǎn)生票據(jù)的ip,則沒有問題,否則就銷毀這個票據(jù)。
為此,我們需要在一開始處理登錄時將用戶的ip保存起來,這樣就可以在以后的請求中隨時驗證后繼請求的ip是否和初始ip相同。保存這個敏感ip的最佳場所當然是UserData啦,而驗證的時機則是在AuthenticateRequest事件發(fā)生時,即Global.aspx.cs中定義的處理此事件的Application_AuthenticateRequest方法中。
上面的示例實際上已經(jīng)是把用戶ip保存到了UserData中,下面是驗證的過程。
if(this.Request.IsAuthenticated) { if(((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData !=this.Request.UserHostAddress) { System.Security.Principal.GenericIdentity gi=new System.Security.Principal.GenericIdentity("",""); string[] rolesi={}; System.Security.Principal.GenericPrincipal gpi=new System.Security.Principal.GenericPrincipal(gi,rolesi); this.Context.User=gpi; } }
通過給GenericPrincipal空的GenericIdentity和roles使票據(jù)失效,這樣將強迫用戶重新登錄。為了測試這個方法,可以先把條件改為相等,看效果如何 :)
這個方法也有不足之處,具體為:
1.使用同一代理的用戶將擁有同一個ip,這樣就不能防范此類假冒攻擊了
2.如果用戶使用動態(tài)ip,則可能造成正常用戶被我們強行銷毀票據(jù)。不過總的來說,這個辦法還是比較可行的。
出處:藍色理想
責任編輯:冰點的冰藍色
上一頁 下一頁 使用安全特性配合Forms驗證進行安全操作
◎進入論壇網(wǎng)絡編程版塊參加討論
|