Web驗證方式--Form Authentication
Form驗證方式並不是HTTP標準,而是在微軟ASP.NET Web框架下提供的一種驗證方式。其大致流程如下:
在上圖的流程中,ASP.NET框架提供了如下支持類:( FormsAuthentication, FormsAuthenticationModule )
在上面流程圖中的第三步中,我們對用戶名密碼進行驗證後。
-可以創建FormAuthenticationTicket對象,將用戶數據存入其中。
-然後調用FormAuthentication類的工具方法Encrypt得到加過密的ticket字符串
-將加過密的ticket字符串寫入名為FormAuthentication.FormCookieName的cookie中
-後續的請求中,瀏覽器都會帶上該cookie.
在上面流程圖第四步中,FormAuthenticationModule會在IIS的Authenticate事件中進行請求攔截
-對請求中攜帶的名為FormAuthentication.FormCookieName的cookie值進行驗證(解密)
-如果驗證通過,用cookie中攜帶的用戶信息創建GenericPrinciple對象並保存在當前請求的HttpContext中,並將該請求設為Authenticated
-如果驗證不通過,或者沒有找到對應的cookie,則返回401給瀏覽器
詳見FormAuthenticationModule源碼。
要在ASP.NET應用中開啟Form Authenticate驗證方式,只需添加如下配置到<system.web>配置節:
<authentication mode="Forms"> <forms loginUrl="Login" name="JW.Auth" />//此處定義了登錄url和cookie的名字 </authentication>
上面的流程圖中有一個環節還沒有描述到,步驟1和步驟4中會對用戶進行驗證是否有訪問改頁面的權限。ASP.NET中可以通過如下配置到<system.web>配置節來拒絕未登錄用戶:
<authorization> <deny users="?"/>//此處拒絕所有為登錄用戶,此處還可以添加<allow>節點允許特定用戶,role發起特定的http method,但是沒有與url的映射起來感覺有點雞肋了。實際項目中可以實現自己的驗證邏輯 </authorization>
ASP.NET框架是通過上面類圖中的UrlAuthorizationModule這個Http Module在IIS的Authorization Request環節對請求按照配置進行授權。未授權的請求則返回401錯誤嗎。
詳見UrlAuthorizationModule源碼
小結:
Form Authentication是ASP.NET框架中內置的驗證方式。其采用cookie作為驗證ticket的保存方式,cookie默認是session內有效。
測試代碼見https://github.com/lbwxly/Authentication
Web驗證方式--Form Authentication