天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

ASP.NET安全問題--Forms驗證的具體介紹(上篇)

  本篇的話題如下:

  Forms驗證的工作原理

  Forms驗證中的API

  Forms驗證的工作原理

  我們知道,Forms驗證主要是基于cookie的,說白一點就是:把用戶信息保存在cookie中,然后發送到客戶端;再就是解析客戶端的發送了的cookie信息,進行解析,然后進行驗證。關于cookieless的工作原理和方法,我這里不贅述,大家可以參看我的另外的一片文章:淺談ASP.NET內部機制(一)。

  當匿名用戶請求一個需要驗證后才能訪問的資源和頁面的時候,那么如果采用了Forms驗證,那么URL授權模塊就會把用戶重定向到登錄頁面。而之前請求的URL就會被保存起來,等到用戶正確的登錄后,就再次轉向之前要請求的頁面。我想這點,大家應該都用過。

  下面我們就看看登錄的時候發生了什么,看看登錄的具體的流程?也請大家注意我使用的一些術語,因為這些術語再Forms中都有特定的對象,大家之后就可以看到的,很重要。

  1.再瀏覽器中有個登錄窗體,要輸入用戶名和密碼等憑證,通過提交給服務器ASP.NET網站來審核,檢查憑證是否正確。
  2.如果憑證正確,那么就會再服務器端就會創建一個"身份驗證票據"。身份驗證票據中含有了經過加密的用戶信息。
  3.這個票據再服務器端被寫入cookie中,然后發送到客戶端。
  4.然后用戶就被重定向到他們最初請求的URL中。


  注:大家可能會有疑問:最初請求的URL到底保存在哪里?不要擔心,現在只要明白上面的流程就OK。
 
  5.上面第4步就是要轉向最初請求的URL,假設最初的請求頁面是Default.ASPx,那么現在就是從登錄的頁面Login.ASPx轉向到Default.ASPx 頁面,此時因為身份驗證的票據cookie已經存在于客戶端的瀏覽器中了,此時的轉向Default.ASPx頁面時,實際是再次向服務器端發起了請求,所以正如我們之前所談到的:每個請求都要從ASP.NET管道中一級級的向后傳,要經歷ASP.NET的的生命周期:Application_BeginRequest,Application_AuthenticateRequest.....。(希望大家明白)

  但是這次的請求就和第一次我們發起的請求步同了,為什么?

  第一次我們請求Default.ASPx頁面的時候,我們根本就沒有提供任何的表明我們身份的票據,但是這次我們已經登錄了,而且我們的瀏覽器中已經有了我們的身份驗證的票據的cookie,此時在Application_AuthenticateRequest事件中,Forms驗證模塊就獲取表明我們身份cookie,然后就利用cookie中信息填充Context.User。

  驗證模塊處理完之后就是授權模塊起作用了。其實URL授權模塊就會利用我們之前填充在Context.User中的信息來驗證用戶是否被批準訪問所請求的資源或者頁面。
 
   Forms驗證中的API

  實現Forms身份驗證之前,我們看看組成Forms驗證的API以及相關的類:
  FormsAuthenticationModule:對每個請求進行驗證的HTTP模塊
  FormsAuthentication:包含在Forms驗證中我們常用的方法和屬性(很重要的)
  FormsIdentity:Forms驗證標識。
  FormsAuthenticationTicket:身份驗證的票據,對用戶的信息進行加密后的產物,我們一般把它寫如cookie中,之前我們談過了的。

  上面的類在System.Web.Security下。

  下面我們來一一介紹.

  FormsAuthenticationModule
  它是一個實現了IHttpModule接口的類。它可以用來處理每個請求的Application_AuthenticateRequest事件。如果發送了的請求中已經包含了cookie信息,那么這個模塊就對cookie信息進行解密和解析,然后構造一個GenericPrincipal的類實例填充Context.User,并且也創建一個FormsIdentity的實例。
       注意:當我們在web.config中配置了Forms驗證后,那么我們在Application_AuthenticateRequest事件寫的代碼要是和Forms相關的API。上篇文章談過了。

  FormsAuthentication類這個類很重要。

  還有一點注意的就是:因為FormsAuthentication和FormsAuthenticationModule名稱很相似,很容易混淆。

  它們之前的區別在于,FormsAuthenticationModule是一個HTTP模塊;而FormsAuthenticate是一個類,它有很多的方法和屬性。更加直白的說就是:它們之前沒有什么關聯,只是在Application_AuthenticateRequest事件中我們常常要調用FormsAuthenticate類的一些方法和屬性。而且FormsAuthenticate的很多方法都是靜態的方法,我們不會創建FormsAuthenticate類的實例。

  還有一點要特別注意的就是FormsAuthenticate的Authenticate方法。
我們之前說過了,我們一般是在登錄窗體中提交用戶信息,然后服務器端驗證提交的信息,我們在服務器端常常是去數據庫中檢查這些信息的正確性,但是去數據庫或者其他的數據存儲(如文件,活動目錄)中去檢查只是一種情況。
還有另外的情況。不知道大家是否記得web.config 中的一個配置的節點:

  如果我們在配置文件配置了上述的信息,那么我們就可以用Authenticate方法來檢查提供了用戶信息(用戶名和密碼)是否正確,如果我們沒有在web.config配置用戶的信息,也就是說我們是把信息保存在數據庫等其他的地方,那么我們就不能Authenticate這個方法。當然我們很少用Authenticate這個方法,因為我們不可能把所有用戶信息硬編碼到配置文件中,但是還是要清楚這個方法。
 
  另外我簡單的介紹一些常用的方法,具體的使用我以后會講述。
在FormsAuthenticate中使用頻繁的是RedirectFromLoginPage方法。每當驗證了用戶的憑證后就會使用到這個方法,也就是我們之前說過的:跳轉到我們最初請求的頁面。
這個方法就這么簡單的一"跳",但是其實在內部做了很多的事情:
  1.為用戶創建一個身份驗證的票據
  2.對身份驗證的票據進行加密
  3.創建一個cookie,把加密的票據保存在cookie中
  4.向HTTP響應添加cookie,并且發送給客戶端。
  5.跳轉,并且把用戶重定向到最初請求的頁面

  另外FormsAuthenticate類還有很多的其他方法和屬性:
  FormsAuthenticate中涉及到客戶端保存cookie的兩個屬性就是:
  FormsCookieName:獲取或者設設置cookie的名稱
  FormsCookiePath:獲取或者設置cookie的url路徑
  其中FormsCookiePath屬性有一點要注意:大多數的瀏覽器會在判斷cookie是否要和請求一起發送時,用到cookie路徑。(我們一般在配置文件配置path="/"),如果我們配置的path不是"/",那么這個cookie就不會和請求發送到服務器端.
FormsAuthenticate中和cookie操作相關的方法有:
  Decrypt:提取身份驗證cookie的加密信息,創建FormsAuthenticationTicket,也就是解密。
  Encrypt:加密。從FormsAuthenticationTicket中獲取信息,并且加密。以備我們之后把加密的信息寫入cookie
  GetAuthCookie:創建身份驗證cookie,但是并不把它立即添加到HTTP響應中
  SetAuthCookie:創建身份驗證cookie,并且把它添加到Response.Cookie中。
  RenewTicketIfOld:刷新身份驗證cookie的生命周期

  GetRedirectUrl:把用戶重定向到他們最初請求的頁面。
       SignOut:使得當前的身份驗證cookie過期。我們常用的注銷功能。
 
  FormsIdentity
  大家現在應該知道什么是標識 Identity,它包含了用戶名和ID標識信息,可以參看我前面的文章。

  FormsAuthenticationTicket 票據
  通過上面的講解,大家已經對它不陌生了,FormsAuthenticationTicket實際上就包含用戶信息的一個類的實例。
注意:FormsAuthenticationTicket和cookie之間的區別:
       cookie其實就是一個載體,容器,它包含了加密后的FormsAuthenticationTicket。

  FormsAuthenticationTicket類的UserName屬性就是用戶的用戶名,我們可以根據這個屬性識別不同的用戶。
由于身份驗證是基于cookie的,所以要考慮到cookie的過期的問題。比如我們在登錄時有個"記住我"的checkbox,如果勾上,那么就創建了一個永不過期的cookie,處于安全,我不提倡這樣。

  所以在FormsAuthenticationTicket也提供了關于設置cookie屬性:
  Expiration:獲取一個表示cookie期滿的DateTime對象
  Expired:判斷cookie是否過期
  IsPersistent:是否在用戶關閉瀏覽器后繼續保存cookie
  IssueDate:返回最初設置cookie的時間

  還有就是CookiePath:設置cookie的保存路徑,前面談論過了,一般設置為"/"。
  另外FormsAuthenticationTicket身份驗證票據目的是識別用戶。同時,我們也可以利用FormsAuthenticationTicket的UserData屬性添加額外的信息,如角色等,然后這額外的信息就可以保存在cookie中。

今天就談這里。大家先有個總體的認識,具體的代碼部分,我們后面談。謝謝各位!!!

NET技術ASP.NET安全問題--Forms驗證的具體介紹(上篇),轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品97久久AV色婷婷综合 | 快播可乐网 | 日日夜夜影院在线播放 | 亚洲视频在线观看不卡 | 肉蒲团从国内封禁到日本成经典 | 人和拘一级毛片 | 麻豆免费观看高清完整视频在线 | 肉动漫h黄动漫日本免费观看 | 免费精品国产人妻国语 | 日本电影免费久久精品 | a视频免费在线 | 99久久re6热精品首页 | 欧美xx69 | 麻豆沈芯语 | FREECHINESE东北女人真爽 free18sex性自拍裸舞 | 黑兽在线观看高清在线播放樱花 | 成年视频国产免费观看 | 哪里能看毛片 | 97超碰97资源在线观看 | 办公室日本肉丝OL在线 | 日韩高清毛片 | 国产精品网红女主播久久久 | 欧美精品成人久久网站 | 成在线人免费视频 | 欧美老妇与zozoz0交 | 高中生高潮抽搐喷出白浆视频 | 美女露100%全身无遮挡 | 国产成人一区免费观看 | a一级一片免费观看视频 | 精品国产在线手机在线 | 亚洲 欧美 国产 综合不卡 | 影音先锋男人av橹橹色 | 亚洲高清视频免费 | 亚洲视频中文字幕在线 | 秋霞电影网伦大理电影在线观看 | 国产手机精品一区二区 | 亚洲免费无码中文在线亚洲在 | 亚洲午夜性春猛交XXXX | 中文字幕AV亚洲精品影视 | 曰批国产精品视频免费观看 | 98久久人妻少妇激情啪啪 |