身份驗證

 

Application.BeginRequest
HttpContext可用 
      |
Application.AuthenticateRequest
填充Identity&Prinicpal對象  //準備驗證對象(可以在這裏定義自己的role組)
      |
Application.AuthorizeRequest
處理自定義的授權需求
      |
Application.AcquireRequestState
Session開始可用,[獲得]響應狀態及轉入Page對象處理
這樣可以防止Session存儲驗證信息
導致不安全因素


<authentication>配置驗證模式
元素只能在應用程序(虛擬目錄)根文件夾下的web.config文件中使用,so每個應用程序只能定義一個身份驗證類型.如果必須使用一個不同的身份認證類型則必須將它定義爲一個獨立的應用程序

<forms>
元素裏的name屬性用於區別同一個web服務器上不同應用程序的cookie name

<authorization>配置驗證授權
是一個批准和拒絕訪問特定資源的過程
可以定義於子文件夾中!!!

不必爲了使用身份驗證而限制對頁面的訪問,純粹爲了個人化而使用身份驗證是完全可能的
所以匿名用戶可以看到通過驗證的用戶的所有可以看到的相同頁面,只不過看到的結果不同而已

將錯誤信息寫成
<asp:label id="ErrMessage" visalbe="false">密碼或者用戶名不正確,請重試</asp:label>
達到表示與業務邏輯的分離

建立身份驗證票據的三種方式
1.一行代碼完成驗證匹配憑據(定義在<credentials>的<user>中),
FormsAuthentication.Authenticate(tbUserName.Text,tbPassword.Text);
FormsAuthentication.RedirectFromLoginPage(tbUserName.Text,false);
第二行創建一個FormsAuthenticationTicket並加密票據,最後寫入cookie並重定向到最初的請求頁面
false表示不創建持久性的cookie(關閉瀏覽器後會繼續保留)

2.用Request.IsAuthenticated判斷是否已經驗證
用FormsAuthentication.Authenticate(tbUserName.Text,tbPassword.Text);的結果來驗證
FormsAuthentication.SetAuthCookie(tbUserName.Text,false);來獲得一個驗證票據,並自動寫入cookie
已達到自定義重定向頁面的功能
可以使用Response.Redirect(Request.Url.LocalPath);請求本身頁面

3.
實現自己的驗證
//    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(admin_id,false,20);  //生成驗證票據
authTicket.UserData可以存儲額外的用戶信息並一起被加密
//    string authStr = FormsAuthentication.Encrypt(authTicket);  //加密票據
//    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,authStr);  //生成加密後的cookie
//    Page.Response.Cookies.Add(authCookie);  //寫入驗證票據cookie
登出都使用簡單的FormsAuthentication.SignOut();即可
然後可以使用Response.Redirect(Request.Url.LocalPath);重新加載本身頁面確保已經變成匿名用戶
可以在((FormsIdentity)User.Identity).Ticket.UserData來訪問UserData
UserData不能存過多信息
ie與netscape支持4096個字節
如果超出則無法寫入cookie並且不能通過身份驗證
可以用生成多個Ticket來生成多個cookie存儲信息
FormsAuthentication.AuthCookieName

要是持久性cookie期滿(即生成時使用參數true)只能用FormsAuthentication.GetAuthCookie來是指期滿時期並手動寫入到http響應中


最好的解決方案時基於角色的授權!!!
用Context.User.IsInRole判斷

假冒
使用<identity impersonate="true" userName="NixStudio/Administrator" password="procedure" />
來啓用假冒來假冒一個windows帳戶

Asp.Net安全模型
無論使用何種身份驗證,程序利用登陸用戶提供的憑據授予用戶Principal(當前角色)和Identity(當前用戶)
Principal對象利用Identity創建
HttpContext.Current.User返回的即是一個實現了Iprincipal的實例
實現角色授權
默認是使用GenericPricipal來填充Context.User
so
1.向身份驗證cookie添加角色
2.利用含有角色的GenericPricipal填充Context.User,並添加用以自定義身份驗證過程的事件處理程序

string[] roles = GetUserRoles(userName);  //取得用戶所屬的角色數組
//一個用戶可以屬於不同的角色
FormsAuthenticationTicket myTicket = new FormsAuthenticationTicket(
1,
tbUserName.Text,
DataTime.Now,
DateTime.Now.AddHour(3),
roleStringArr);

Application_OnAuthentiateRequest事件中可以來將用戶的角色添加到HttpContext中
比如
或者也可以在自己驗證過用戶登陸後
System.Web.Security.GenericPincipal gp = new GenericPrincipal(Context.User.Identity,roles);
Context.User = gp;

然後用User.IsInRole("roleName")判斷是否屬於某個角色
然後決定相應的顯示和功能

防止cookie被盜
可以通過監控用戶的IP地址
即將ip信息寫入Ticket中,然後驗證是否來自同一個ip
FormsAuthenticationTicket ft = new FormsAuthentication(
FormsAuthentication.FormsCookieName,
DateTime.Now,
DateTime.Now.AddHours(2),
false,
Request.UserHostAddress.ToString());

判斷Request.UserHostAddress.ToString() ?= (FormsIdentity(User.Identity)).Ticket.UserData即可
如果!=
則使用新的匿名標誌填充
GenericIdentity i = new GenericIdentity("","");
string roles[] = {};
Context.User = new GenericPrincipal(i,roles);
也可以觸發異常或者記錄日誌或者更多操作

問題:可能共享代理上網(ip一樣)可能動態ip結果導致程序不必要的麻煩,即存儲持久cookie會很困難

保存登陸用戶列表
可以用Application["CurrentUsers"] = new HashTable();
來存儲
用Session.SessionID來作爲全局標誌

提供多個登陸頁面
1.使用單獨的登陸頁面,但自定義爲多個頁面
2.使用配置過的登陸頁面
使用Response.Redirect在服務端進行重定向不必經過驗證程序
因爲已經過了那個環節了
或者使用location path="fileName.aspx"來配置對這些頁面的允許訪問

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