webconfig登錄驗證的方式和原理_第1頁
webconfig登錄驗證的方式和原理_第2頁
webconfig登錄驗證的方式和原理_第3頁
webconfig登錄驗證的方式和原理_第4頁
webconfig登錄驗證的方式和原理_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、如何運用 Form 表單認證ASP.NET 的安全認證,共有“Windows”“Form”“Passport”“None”四種驗證模式。“Windows”與“None”沒有起到保護的作用,不推薦使用;“Passport”我又沒用過,唉所以我只好講講“Form”認證了。我打算分三部分:第一部分 怎樣實現From 認證;第二部分 Form 認證的實戰運用;第三部分 實現單點登錄(Single Sign On)第一部分 如何運用 Form 表單認證一、     新建一個測試項目為了更好說明,有必要新建一個測試項目(暫且為“FormTest”吧),包含三張頁面足

2、矣(Default.aspx、Login.aspx、UserInfo.aspx)。啥?有人不會新建項目,不會新增頁面?你問我咋辦?我看這么辦好了:拖出去,打回原藉,從幼兒園學起二、     修改 Web.config1、 雙擊項目中的Web.config(不會的、找不到的打 PP)2、 找到下列文字 <authentication mode="Windows" /> 把它改成:<authentication mode="Forms"><forms loginUrl="Logi

3、n.aspx" name=".ASPXAUTH"></forms></authentication>3、 找到<authorization> <allow users="*" /></authorization>換成<authorization><deny users="?"></deny></authorization>這里沒什么好說的,只要拷貝過去就行。雖說如此,但還是有人會弄錯,如下:<authent

4、ication mode="Forms">    <forms loginUrl="Login.aspx" name=".APSX"></forms><deny users="?"></deny></authentication>若要問是誰把 <deny users="?"></deny> 放入 <authentication> 中的,我會很榮幸地告訴你,那是 N

5、年前的我:<authentication> 與 <authorization> 都是以 auth 字母開頭又都是以 ation 結尾,何其相似;英文單詞背不下來的我以為他們是一伙的三、     編寫 .cs 代碼登錄與退出1、 登錄代碼:a、 書本上介紹的      private void Btn_Login_Click(object sender, System.EventArgs e)        

6、60;     if(this.Txt_UserName.Text="Admin" && this.Txt_Password.Text="123456")        System.Web.Security.FormsAuthentication.RedirectFromLoginPage(this.Txt_UserName.Text,false);b、 偶找了 N 久才找到的private void Btn_Login_Cli

7、ck(object sender, System.EventArgs e)              if(this.Txt_UserName.Text="Admin" && this.Txt_Password.Text="123456")        System.Web.Security.FormsAuthentication.SetAuthCo

8、okie(this.Txt_UserName.Text,false);Response.Redirect("Default.aspx");以上兩種都可發放驗證后的 Cookie ,即通過驗證,區別:方法 a) 指驗證后返回請求頁面,俗稱“從哪來就打哪去”。比如:用戶沒登錄前直接在 IE 地址欄輸入 http:/localhost/FormTest/UserInfo.aspx ,那么該用戶將看到的是 Login.aspx?ReturnUrl=UserInfo.aspx ,輸入用戶名與密碼登錄成功后,系統將根據“ReturnUrl”的值,返回相應的頁面方法 b) 則是分兩步走:

9、通過驗證后就直接發放 Cookie ,跳轉頁面將由程序員自行指定,此方法多用于 Default.aspx 使用框架結構的系統。2、 退出代碼:private void Btn_LogOut_Click(object sender, System.EventArgs e)System.Web.Security.FormsAuthentication.SignOut();四、     如何判斷驗證與否及獲取驗證后的用戶信息有的時候,在同一張頁面需要判斷用戶是否已經登錄,然后再呈現不同的布局。有人喜歡用 Session 來判斷,我不反對此類做法,在此我只是想告

10、訴大家還有一種方法,且看下面代碼:if(User.Identity.IsAuthenticated)        /你已通過驗證,知道該怎么做了吧?User.Identity 還有兩個屬性AuthenticationType(驗證類型)與 Name(用戶名稱) ,大家要注意的是 Name 屬性,此處的User.Identity.Name將得到,驗證通過(RedirectFromLoginPage 或SetAuthCookie)時,我們帶入的第一個參數 this.Txt_UserName.Text 。這個參數很重要,關系到種

11、種種種的情況,何出此言,且聽下回分解靈活運用 Form 表單認證中的 deny 與 allow 及保護 .htm 等文件第二部分 Form 認證的實戰運用Web.config 的作用范圍新建項目時, VS.Net 會在項目根目錄建立一個內容固定的 Web.config。除了在項目根目錄,你還可以在任一目錄下建立 Web.config ,條件就是應用程序級別的節點只能在根目錄的 Web.config 中出現。至于哪些是應用程序級別節點呢,這個問題嘛,其實我也不太清楚,呵呵。電腦不是我發明的,微軟不是我創建的,C# 更不是我說了算的,神仙也有不知道的,所以我不曉得是正常的。話雖如此,只要它不報錯,

12、那就是對的。關于 Web.config 設置的作用范圍,記住以下兩點:1、 Web.config 的設置將作用于所在目錄的所有文件及其子目錄下的所有東東(繼承:子隨父姓)2、 子目錄下的 Web.config 設置將覆蓋由父目錄繼承下來的設置(覆蓋:縣官不如現管)給大家提個問題:有沒有比根目錄Web.config 的作用范圍還大的配置文件呢?看完第三部分便知分曉。六、     學會拒絕與巧用允許回到我們在第一回合新建的測試項目“FormTest” ,既然要進行驗證,按國際慣例,就得有用戶名與密碼。那,這些用戶是管理員自己在數據庫建好呢,還是用戶注冊、管理

13、員審核好呢。只要不是一般的笨蛋,都知道選擇后者。你們還別說,我公司還真有個別項目是管理員連到數據庫去建帳號的,屬于比較特殊的笨蛋,咱們不學他也罷,還是老老實實添加兩個頁面吧注冊頁面(Register.aspx)與審核頁面(Auditing.aspx)。問題終于就要浮出水面啦,當你做好 Register.aspx 時,想訪問它的時候突然覺得不對勁,怎么又回到了登錄頁面?你仔細瞧瞧網址,是不是成了:Login.aspx?ReturnUrl=Register.aspx 。怎么辦,用戶就是因為沒有帳號才去訪問注冊頁面的呀?(這句純屬廢話,有帳號誰還跑去注冊。)我時常對我的同事說:“辦法是人想出來滴!”

14、1、 新建一個目錄 Public ,用于存放一些公用的文件,如萬年歷、腳本呀2、 在“解決方案資源管理器”中右擊點擊目錄 Public ,新增一個 Web.config3、 把上述 Web.config 的內容統統刪除,僅留以下即可:<?xml version="1.0" encoding="utf-8"?><configuration><system.web><authorization><allow users="*"/></authorization><

15、;/system.web></configuration>終于切入正題了,不容易呀。根據“覆蓋”原則,我們知道上述 Web.config 將替代根目錄 Web.config 中的 <authorization> 節點設置,即:    <allow users="*"/> 替換 <deny users="?"></deny>注解:“allow”允許的意思;“*”表示所有用戶;    “deny” 拒絕的意思;“?”表示匿名用戶;因此

16、,處于 Public 目錄下的文件,允許所有人瀏覽,包括未驗證的用戶。把 Register.aspx 拖進來吧,再也不會有人阻止你瀏覽啦。除了注冊頁面,我們還提到一個審核頁面(Auditing.aspx),審核權限一般都在管理員或主管手里,并不想讓其他人瀏覽此頁面(真理往往掌握在少數人的手里,這也是沒法子的事),怎么辦?“辦法是人想出來滴”呵呵新建一個管理員的目錄 ManageSys ,在此目錄下再新增一個 Web.config。內容如下:<?xml version="1.0" encoding="utf-8"?><configurat

17、ion><system.web><authorization><allow users="Admin"/><deny users="*"/></authorization></system.web></configuration>System.Web.Security.FormsAuthentication.SetAuthCookie(this.Txt_UserName.Text,false); /通過驗證,發放 Cookie之前我曾強調,要注意,第一個參數很重要,

18、重要到什么程度?說到這,恐怕地球人都知道了它就是allow與deny的依據。假如此處用戶填寫的是“Admin”即 this.Txt_UserName.Text = "Admin" 那么進入系統后,他就能訪問 ManageSys 目錄下的網頁了,其它閑雜人等一律拒之門外。以上 from1: 在web.config中,加入form認證;    <authentication mode="Forms">   <forms name="auth" loginUrl="

19、;index.aspx" timeout="30"></forms></authentication><authorization>   <deny users="?" /></authorization>2: 如果有注冊頁面時還應該允許匿名用戶調用注冊頁面進行注冊;以下代碼應該在<configuration><system.web>之間,而不應該包含到<system.web>.</system.web>之間;-

20、表示允許 匿名用戶對 userReg.aspx頁面進行訪問.<location path="userReg.aspx">   <system.web>    <authorization>     <allow users="?" />    </authorization>   </system.web></location>3 在

21、登錄成功后要 創建身份驗證票, 表明已經通過認證的合法用戶;if(登陸成功)System.Web.Security.FormsAuthentication.SetAuthCookie(用戶名稱, false);1.使用Forms驗證存儲用戶自定義信息Forms驗證在內部的機制為把用戶數據加密后保存在一個基于cookie的票據FormsAuthenticationTicket中,因為是經過特殊加密的,所以應該來說是比較安全的。而.net除了用這個票據存放自己的信息外,還留了一個地給用戶自由支配,這就是現在要說的UserData。UserData可以用來存儲string類型的信息,并且也享受For

22、ms驗證提供的加密保護,當我們需要這些信息時,也可以通過簡單的get方法得到,兼顧了安全性和易用性,用來保存一些必須的敏感信息還是很有用的。下面來看怎么使用UserData,然后會給出一個實際使用的例子。/創建一個新的票據,將客戶ip記入ticket的userdataFormsAuthenticationTicket ticket=new FormsAuthenticationTicket(1,userName.Text,DateTime.Now,DateTime.Now.AddMinutes(30),false,Request.UserHostAddress);/將票據加密string au

23、thTicket=FormsAuthentication.Encrypt(ticket);/將加密后的票據保存為cookieHttpCookie coo=new HttpCookie(FormsAuthentication.FormsCookieName,authTicket);/使用加入了userdata的新cookieResponse.Cookies.Add(coo);下面是FormsAuthenticationTicket構造函數的重載之一的方法簽名public FormsAuthenticationTicket(int version,string name,DateTime issu

24、eDate,DateTime expiration,bool isPersistent,string userData);參數version版本號。name與身份驗證票關聯的用戶名。issueDateCookie 的發出時間。expirationCookie 的到期日期。isPersistent如果 Cookie 是持久的,為 true;否則為 false。userData將存儲在 Cookie 中的用戶定義數據使用userdata也很簡單,FormsIdentity的Ticket屬性就提供了對當前票據的訪問,獲得票據后就可以用UserData屬性訪問保存的信息,當然是經過解密的。(Syste

25、m.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData下面是一個具體的應用。由于Forms驗證是通過cookie來進行的,它需要傳遞一個票據來進行工作。雖然票據是加密的,里面的內容不可見,但這并不能阻止別人用一個假冒的身份使用票據(就像我們可以拿別人的鑰匙去開別人的鎖),比較常見的就是不同ip的用戶在不安全通道截獲了這個票據,然后使用它進行一些安全范圍外的活動。解決這個問題的辦法之一就是使用SSL來傳遞信息。但是如果不能使用SSL呢?我們可以判斷ip和票據是否匹配,如果發出請求的ip是初次產生票據的ip,

26、則沒有問題,否則就銷毀這個票據。為此,我們需要在一開始處理登錄時將用戶的ip保存起來,這樣就可以在以后的請求中隨時驗證后繼請求的ip是否和初始ip相同。保存這個敏感ip的最佳場所當然是UserData啦,而驗證的時機則是在AuthenticateRequest事件發生時,即Global.aspx.cs中定義的處理此事件的Application_AuthenticateRequest方法中。上面的示例實際上已經是把用戶ip保存到了UserData中,下面是驗證的過程。if(this.Request.IsAuthenticated)if(System.Web.Security.FormsIdent

27、ity)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.GenericPrin

28、cipal(gi,rolesi);this.Context.User=gpi;通過給GenericPrincipal空的GenericIdentity和roles使票據失效,這樣將強迫用戶重新登錄。為了測試這個方法,可以先把條件改為相等,看效果如何 :)這個方法也有不足之處,具體為:1.使用同一代理的用戶將擁有同一個ip,這樣就不能防范此類假冒攻擊了2.如果用戶使用動態ip,則可能造成正常用戶被我們強行銷毀票據。不過總的來說,這個辦法還是比較可行的。2.使用安全特性配合Forms驗證進行安全操作。PrincipalPermissionAttribute可以配合Forms驗證進行基于角色或用戶的

29、安全驗證,該特性不能用于程序集級別。它的作用范圍可以是類或具體的方法。來看一個簡單的示例。PrincipalPermission(SecurityAction.Demand,User="Notus")public class Test : BasePageprivate void Page_Load(object sender, System.EventArgs e)trythis.sayHello();this.sayHello2();catch(Exception ex)Response.Write(ex.ToString();private void sayHello

30、()Response.Write("hello world!");private void sayHello2()Response.Write("hello PrincipalPermissionAttribute!");#region Web 窗體設計器生成的代碼override protected void OnInit(EventArgs e)/ CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。/InitializeComponent();base.OnInit(e);/ <summary>/ 設計器支持所需的方

31、法 - 不要使用代碼編輯器修改/ 此方法的內容。/ </summary>private void InitializeComponent()this.Load += new System.EventHandler(this.Page_Load);#endregion注意這個例子一開始是作用于整個類的,生成后執行,如果當前用戶不是Notus,就會發生異常System.Security.SecurityException,提示對主體權限的請求失敗。反之,則可以順利訪問,并輸出兩個hello world!,注意是兩個。現在的安全作用范圍是整個類。接下來我們改一下特性的作用范圍。將特性聲明

32、移到sayHello2方法上面,重新編譯后運行,就會發現程序在運行到sayHello2方法后拋出了System.Security.SecurityException。這說明現在安全作用范圍縮小到了方法級別。該特性可以通過設置User和Role來進行基于用戶和角色的安全保護。另外其使用的第一個參數是SecurityAction枚舉,該枚舉設置了具體的保護級別或措施。像我們現在使用的這個Demand,是要求調用堆棧中的所有高級調用方都已被授予了當前權限對象所指定的權限。下面是msdn給的示例示例下面的示例說明可以如何以聲明方式使用 PrincipalPermission 要求當前用戶是 Bob 并

33、且屬于 Supervisor 角色。PrincipalPermissionAttribute(SecurityAction.Demand, Name="Bob",Role="Supervisor")下面的示例說明如何要求當前用戶的身份是 Bob,與角色成員條件無關。PrincipalPermissionAttribute(SecurityAction.Demand, Name="Bob")下面的示例說明如何僅要求對用戶進行身份驗證。PrincipalPermissionAttribute(SecurityAction.Demand,

34、Authenticated=true)再要說一下的是,這里面的User和Role是可以和Forms驗證集成的,據此,我們可以在一些重要的類或方法中使用PrincipalPermissionAttribute,以將自己的程序武裝到家。而實際上,該特性的作用遠不止這些,更詳細的信息可以查閱msdn。或者:1.配置Web.Config文件設置為Form認證:<authentication mode="Forms">      <forms name="oursnet" loginUrl=&qu

35、ot;login.aspx" timeout="10" /></authentication> 其中:        name:        決定驗證用戶時所使用的Cookie名稱        loginurl:     在用戶沒有登錄是,被重定向的頁面        timeout:     超時時間,單位為分鐘不允許匿名登錄<authorization>         <!- 允許所有用戶 -><deny users="?" />            <!- <allow&#

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論