1. 程式人生 > >Web驗證方式--Form Authentication

Web驗證方式--Form Authentication

小結 forms security user http 配置 內置 div eight

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