基于窗體的驗證是最為普遍的一種驗證,使用這種驗證方式可以很方便靈活地應用到應用程序中。窗體驗證方式對基于用戶的驗證授權提供了很好的支持,可以通過一個登錄頁面驗證用戶的身份,將此用戶的身份發回到客戶端的Cookie,之后此用戶再訪問這個web應用就會連同這個身份Cookie一起發送到服務端。服務端上的授權設置就可以根據不同目錄對不同用戶的訪問授權進行控制了。
要采用窗體驗證,先要在應用程序根目錄中的Web.config中做相應的設置:
<authentication mode="forms">
<forms name=".ASPXAUTH " loginUrl="/Login.aspx" timeout="30" path= "/">
</forms>
</authentication>
其中<authentication mode= "Forms"> 表示本應用程序采用Forms驗證方式。
(1)<Forms>標簽中的name表示指定要用于身份驗證的 HTTP Cookie。默認情況下,name 的值是 .ASPXAUTH。采用此種方式驗證用戶后,以此用戶的信息建立一個FormsAuthenticationTicket類型的身份驗證票,再加密序列化為一個字符串,最后將這個字符串寫到客戶端的name指定名字的Cookie中。一旦這個Cookie寫到客戶端后,此用戶再次訪問這個web應用時會將連同Cookie一起發送到服務端,服務端將會知道此用戶是已經驗證過的。
再看一下身份驗證票都包含哪些信息呢,我們看一下FormsAuthenticationTicket類:
CookiePath: 返回發出 Cookie 的路徑。注意,窗體的路徑設置為 /。由于窗體區分大小寫,這是為了防止站點中的 URL 的大小寫不一致而采取的一種保護措施。這在刷新 Cookie 時使用。
Expiration: 獲取 Cookie 過期的日期/時間。
IsPersistent: 如果已發出持久的 Cookie,則返回 true。否則,身份驗證 Cookie 將限制在瀏覽器生命周期范圍內。
IssueDate: 獲取最初發出 Cookie 的日期/時間。
Name: 獲取與身份驗證 Cookie 關聯的用戶名。
UserData :獲取存儲在 Cookie 中的應用程序定義字符串。
Version: 返回字節版本號供將來使用。
(2) <Forms>標簽中的loginUrl指定如果沒有找到任何有效的身份驗證Cookie,為登錄將請求重定向到的 URL。默認值為 Login.aspx。loginUrl指定的頁面就是用來驗證用戶身份的,一般此頁面提供用戶輸入用戶名和密碼,用戶提交后由程序來根據自己的需要來驗證用戶的合法性(大多情況是將用戶輸入信息同數據庫中的用戶表進行比較),如果驗證用戶有效,則生成同此用戶對應的身份驗證票,寫到客戶端的Cookie,最后將瀏覽器重定向到用戶初試請求的頁面,一般是用FormsAuthentication.RedirectFromLoginPage 方法來完成生成身份驗證票,寫回客戶端,瀏覽器重定向等一系列的動作。RedirectFromLoginPage 方法含有3個參數,函數定義如下:
public static void RedirectFromLoginPage( string userName, bool createPersistentCookie, string strCookiePath )其中:
userName: 就是此用戶的標示,用來標志此用戶的唯一標示,不一定要映射到用戶賬戶名稱;
createPersistentCookie: 標示是否發出持久的 Cookie。若不是持久Cookie,Cookie的有效期Expiration屬性有當前時間加上web.config中timeout的時間,每次請求頁面時,在驗證身份過程中,會判斷是否過了有效期的一半,要是的話更新一次cookie的有效期;若是持久cookie,Expiration屬性無意義,這時身份驗證票的有效期有cookie的Expires決定,RedirectFromLoginPage方法給Expires屬性設定的是50年有效期;
strCookiePath: 標示將生成的Cookie的寫到客戶端的路徑,身份驗證票中保存這個路徑是在刷新身份驗證票Cookie時使用(這也是生成Cookie的Path),若沒有strCookiePath 參數,則使用web.config中 path屬性的設置。
這里可以看到,此方法參數只有三個,而身份驗證票的屬性有七個,不足的四個參數是這么來的:
IssueDate: Cookie發出時間由當前時間得出;
Expiration:過期時間由當前時間和下面要說的<Forms>標簽中timeout參數算出。此參數對非持久性cookie有意義;
UserData: 這個屬性可以用應用程序寫入一些用戶定義的數據,此方法沒有用到這個屬性,只是簡單的將此屬性置為空字符串,請注意此屬性,在后面我們將要使用到這個屬性;
Version: 版本號由系統自動提供。
RedirectFromLoginPage方法生成生成身份驗證票后,會調用FormsAuthentication.Encrypt 方法,將身份驗證票加密為字符串,這個字符串將會是以.ASPXAUTH為名字的一個Cookie的值。這個Cookie的其它屬性的生成:Domain,Path屬性為確省值,Expires視createPersistentCookie參數而定,若是持久cookie,Expires設為50年以后過期;若是非持久cookie,Expires屬性不設置。
生成身份驗證Cookie后,將此Cookie加入到Response.Cookies中,等待發送到客戶端。最后RedirectFromLoginPage方法調用FormsAuthentication.GetRedirectUrl 方法獲取到用戶原先請求的頁面,重定向到這個頁面。
(3) <Forms>標簽中的timeout和path,是提供了身份驗證票寫入到Cookie過期時間和默認路徑。
經過上面的幾步,就完成了基于窗體身份驗證的過程。基于窗體的身份驗證使用的時是非常靈活的 ,在實際應用中可以根據用戶身份進行授權管理,包括基于角色的用戶權限管理等。下面一節中,我們來介紹基于Windows的身份驗證。
下面這個實例演示了如何利用窗體驗證來實現ASP.NET的安全控制的。實例是在我們前面已經建立好的MyFirst應用程序中完成的,該Web應用程序包含兩個Web窗體,一個是index.aspx,代表默認主頁,一個是Login.aspx,代表用戶登錄系統頁面。
首先是Web.config配置文件,如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation defaultLanguage="vb" debug="true" />
<customErrors mode="RemoteOnly" />
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="Login.aspx" timeout="30"></forms>
</authentication>
<authorization>
<deny users="admin2" />
<deny users="?" />
</authorization>
<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
</system.web>
</configuration>
Index.aspx的HTML代碼如下:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="index.aspx.vb" Inherits="MyFirst.WebForm2"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>基于Web窗體的身份驗證實例</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋體">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 112px; POSITION: absolute; TOP: 72px" runat="server"
Text="刪除Cookies"></asp:Button></FONT></form>
</body>
</HTML>