基於窗體的驗證是最為普遍的一種驗證使用這種驗證方式可以很方便靈活地應用到應用程序中窗體驗證方式對基於用戶的驗證授權提供了很好的支持可以通過一個登錄頁面驗證用戶的身份將此用戶的身份發回到客戶端的Cookie之後此用戶再訪問這個web應用就會連同這個身份Cookie一起發送到服務端服務端上的授權設置就可以根據不同目錄對不同用戶的訪問授權進行控制了
要采用窗體驗證先要在應用程序根目錄中的nfig中做相應的設置:
<authentication mode=forms>
<forms name=ASPXAUTH loginUrl=/Loginaspx timeout= path= />
</forms>
</authentication>
其中<authentication mode= Forms> 表示本應用程序采用Forms驗證方式
()<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 返回字節版本號供將來使用
() <Forms>標簽中的loginUrl指定如果沒有找到任何有效的身份驗證Cookie為登錄將請求重定向到的 URL默認值為 LoginaspxloginUrl指定的頁面就是用來驗證用戶身份的一般此頁面提供用戶輸入用戶名和密碼用戶提交後由程序來根據自己的需要來驗證用戶的合法性(大多情況是將用戶輸入信息同數據庫中的用戶表進行比較)如果驗證用戶有效則生成同此用戶對應的身份驗證票寫到客戶端的 Cookie最後將浏覽器重定向到用戶初試請求的頁面一般是用FormsAuthenticationRedirectFromLoginPage 方法來完成生成身份驗證票寫回客戶端浏覽器重定向等一系列的動作RedirectFromLoginPage 方法含有個參數函數定義如下
public static void RedirectFromLoginPage( string userName bool createPersistentCookie string strCookiePath )其中
userName 就是此用戶的標示用來標志此用戶的唯一標示不一定要映射到用戶賬戶名稱
createPersistentCookie標示是否發出持久的 Cookie若不是持久CookieCookie的有效期Expiration屬性有當前時間加上nfig中timeout的時間每次請求頁面時在驗證身份過程中會判斷是否過了有效期的一半要是的話更新一次cookie的有效期若是持久cookieExpiration屬性無意義這時身份驗證票的有效期有cookie的Expires決定RedirectFromLoginPage方法給Expires屬性設定的是年有效期
strCookiePath標示將生成的Cookie的寫到客戶端的路徑身份驗證票中保存這個路徑是在刷新身份驗證票Cookie時使用(這也是生成Cookie的Path)若沒有strCookiePath 參數則使用nfig中 path屬性的設置
這裡可以看到此方法參數只有三個而身份驗證票的屬性有七個不足的四個參數是這麼來的
IssueDate Cookie發出時間由當前時間得出
Expiration過期時間由當前時間和下面要說的<Forms>標簽中timeout參數算出此參數對非持久性cookie有意義
UserData 這個屬性可以用應用程序寫入一些用戶定義的數據此方法沒有用到這個屬性只是簡單的將此屬性置為空字符串請注意此屬性在後面我們將要使用到這個屬性
Version 版本號由系統自動提供
RedirectFromLoginPage 方法生成生成身份驗證票後會調用FormsAuthenticationEncrypt 方法將身份驗證票加密為字符串這個字符串將會是以ASPXAUTH為名字的一個Cookie的值這個Cookie的其它屬性的生成 DomainPath屬性為確省值Expires視createPersistentCookie參數而定若是持久cookieExpires設為年以後過期若是非持久cookieExpires屬性不設置
生成身份驗證Cookie後將此Cookie加入到ResponseCookies中等待發送到客戶端最後 RedirectFromLoginPage方法調用FormsAuthenticationGetRedirectUrl 方法獲取到用戶原先請求的頁面重定向到這個頁面
() <Forms>標簽中的timeout和path是提供了身份驗證票寫入到Cookie過期時間和默認路徑
經過上面的幾步就完成了基於窗體身份驗證的過程基於窗體的身份驗證使用的時是非常靈活的 在實際應用中可以根據用戶身份進行授權管理包括基於角色的用戶權限管理等下面一節中我們來介紹基於Windows的身份驗證
下面這個實例演示了如何利用窗體驗證來實現ASPNET的安全控制的實例是在我們前面已經建立好的MyFirst應用程序中完成的該Web應用程序包含兩個Web窗體一個是indexaspx代表默認主頁一個是Loginaspx代表用戶登錄系統頁面
首先是nfig配置文件如下
<?xml version= encoding=utf ?>
<configuration>
<systemweb>
<compilation defaultLanguage=vb debug=true />
<customErrors mode=RemoteOnly />
<authentication mode=Forms>
<forms name=ASPXAUTH loginUrl=Loginaspx timeout=></forms>
</authentication>
<authorization>
<deny users=admin />
<deny users=? />
</authorization>
<trace enabled=false requestLimit= pageOutput=false traceMode=SortByTime localOnly=true />
<sessionState
mode=InProc
stateConnectionString=tcpip=:
sqlConnectionString=data source=;Trusted_Connection=yes
cookieless=false
timeout=
/>
<globalization requestEncoding=utf responseEncoding=utf />
</systemweb>
</configuration>
Indexaspx的HTML代碼如下
<%@ Page Language=vb AutoEventWireup=false Codebehind=indexaspxvb Inherits=MyFirstWebForm%>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
<HTML>
<HEAD>
<title>基於Web窗體的身份驗證實例</title>
<meta content=Microsoft Visual Studio NET name=GENERATOR>
<meta content=Visual Basic NET name=CODE_LANGUAGE>
<meta content=JavaScript name=vs_defaultClientScript>
<meta content= name=vs_targetSchema>
</HEAD>
<body MS_POSITIONING=GridLayout>
<form id=Form method=post runat=server>
<FONT face=宋體>
<asp:Button id=Button runat=server
Text=刪除Cookies></asp:Button></FONT></form>
</body>
</HTML>
From:http://tw.wingwit.com/Article/program/net/201311/12989.html