表單驗證的疑難排解

文章編號: 910439 - 檢視此文章適用的產品。
ASP.NET 支援語音資料行

表單驗證的疑難排解

若要自訂您的需要此資料行的 我們想要邀請您送出您的想法,有關您感興趣的主題,而且在將來知識庫文件和支援語音資料行,處理您想要查看的問題。您可以送出您的想法和使用 Ask For It 表單的意見反應。另外還有連結至表單底部的 這個資料行。
全部展開 | 全部摺疊

在此頁中

歡迎使用 ASP.NET 支援語音資料行!我的名稱是 Jerry Orman。我已經與 Microsoft 超過 5 年,花了大部分的焦點放在與 Web 相關的技術,例如 Microsoft FrontPage 和新的 Microsoft SharePoint 技術我時間。我花了使用 Microsoft ASP.NET 支援工程師為最後一年。這個月中 [支援語音資料行,我將說明如何疑難排解 Microsoft ASP.NET 中的表單驗證。

表單驗證的疑難排解

當您在 ASP.NET 應用程式中使用表單驗證時,您可能會發現需要對使用者隨機重新導向至登入網頁時,就會發生的問題做疑難排解。在理想的世界會在以會讓指令碼的方式發生此問題您輕鬆地附加偵錯工具,並擷取問題。在實際執行環境不過,這是很少大小寫。如果要疑難排解類似的隨機問題,您需要記錄,以便您可以縮小根本原因的相關問題的資訊。

在本專欄中我們將簡要說明表單驗證概念。我們會再研究哪些案例會導致使用者被重新導向至登入網頁,以及如何擷取來隔離問題相關的資料。我們也將說明如何實作 IHttpModule 介面來記錄表單驗證資訊。

表單驗證 」 概觀

當使用者使用表單驗證來驗證到網站上時,伺服器建立 Cookie。Cookie 的值是加密的表單驗證票證。Cookie 會傳遞到伺服器應用程式對每個要求,並 FormsAuthenticationModule 類別將解密 Cookie 值,並決定是否使用者是有效或不。

根據預設 FormsAuthenticationModule Machine.config 檔中加入類別。FormsAuthenticationModule 類別會管理 FormsAuthentication 程序。

下列是從 Machine.config 檔的項目:
<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>
一般的 HTTP 流量,來使用表單驗證來驗證看起來類似下列:
  1. 用戶端傳送的 HTTP GET 來 Default.aspx。沒有表單驗證 Cookie 就會傳送。
  2. 伺服器傳送 Login.aspx 302 的回應 (重新導向)。
  3. 用戶端會將 HTTP POST 傳送至 Login.aspx。它包括登入資訊。
  4. 伺服器傳送 Default.aspx 302 的回應 (重新導向)。包含了表單驗證 Cookie。
  5. 用戶端傳送的 HTTP GET 來 Default.aspx。這包括表單驗證 Cookie。
如需有關實作和使用表單驗證的詳細資訊,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx
http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx
http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspx
如需有關共用表單驗證 Cookie 的詳細資訊,請造訪下列 ASP.NET 網站:
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

原因使用者可能會被重新導向到登入頁面

表單驗證 Cookie 將會遺失

案例 1

在此案例在使用者登入到網站中。有些時候,用戶端會與伺服器傳送一個要求,並 FormsAuthenticationModule 類別不會接收 Cookie。您可以決定是否使用者要求不包含在 Cookie 藉由啟用記錄在 Microsoft 「 網際網路資訊服務 (IIS) 的 Cookie。如果要執行這項操作,請依照下列步驟執行:
  1. 開啟 IIS Microsoft 管理主控台 (MMC)。
  2. 以滑鼠右鍵按一下 [網站] 上,然後按一下 [內容]
  3. 按一下 [網站] 索引標籤,然後按一下 [啟用記錄
  4. 請確定記錄檔格式 W3C 擴充記錄檔格式
  5. 按一下 [內容]。
  6. 按一下 [進階] 索引標籤,然後按一下 [擴充內容]。
  7. 在 [擴充內容,] 底下按一下以選取 Cookie(cs(Cookie)) 核取方塊和 Referer (cs(Referer))] 核取方塊。
之所以發生這個問題之後, 判斷哪些用戶端有問題,該用戶端 IP 位址。[IIS 登入該用戶端的 IP 位址及檢視的篩選器 <Cookie > 資料行。

附註您可以使用記錄檔剖析器來剖析 IIS 記錄檔。如果要下載記錄檔剖析器,請造訪下列 Microsoft 網站:
http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07
在您從該特定的使用者要求的清單之後,搜尋要求至登入頁面。您知道他們已被重新導向至這個網頁,而您想要重新導向發生前,請參閱該要求。如果您看到類似下列用戶端可能並未傳送 Cookie,或者在用戶端和伺服器之間網路已移除 Cookie。

這是初始登入。
摺疊此表格展開此表格
方法頁面回應Cookie
取得/Default.aspx302 (重新導向)無 Cookie
取得/Login.aspx200 (成功)無 Cookie
張貼/Login.aspx302 (重新導向)無 Cookie
取得/Default.aspx200 (成功).aspxauth
取得/SomePage.aspx302 (重新導向)沒有.ASPXAUTH Cookie
這些是其他要求之後要求的頁面而.ASPXAUTH Cookie 不在網站上。
摺疊此表格展開此表格
方法頁面回應Cookie
取得/SomePage.aspx302 (重新導向)沒有.ASPXAUTH Cookie
取得/Login.aspx200 (成功)沒有.ASPXAUTH Cookie
張貼/Login.aspx302 (重新導向)沒有.ASPXAUTH Cookie
取得/SomePage.aspx200 (成功).aspxauth

附註第一個要求從該使用者不可能有表單驗證 Cookie,除非您正在建立永續性 Cookie。IIS 記錄檔只會顯示您已收到要求中的 Cookie。表單驗證 Cookie,第一個的邀請會在要求後成功的登入嘗試。
案例 2

超過用戶端 Cookie 限制時,表單驗證 Cookie 可能也會遺失。在 Microsoft Internet Explorer 中沒有 20 Cookie 的限制。20 Cookie 會在用戶端上建立之後先前的 Cookie 會從用戶端的集合中移除。如果移除.ASPXAUTH Cookie 使用者將被重新導向至登入網頁處理下一個要求時。

您可以以相同的方式來疑難排解這兩種情況。 查看之前重新導向至登入網頁要求。如果這個頁面的要求產生 Cookie,這將會是調查的東西。

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
306070在 Internet Explorer 中 Cookie 的數字及大小限制

您可以使用 Fiddler 來檢視傳送至用戶端的 HTTP 標頭。擷取資料傳輸後連按兩下一個要求,然後再按 [若要查看設定 Cookie 標頭的 標頭檔。如果您追蹤成功的登入,您將會看到成功的登入回應中設定 Cookie 標頭。

如果要下載 Fiddler,請造訪下列 Fiddler 網站:
http://www.fiddlertool.com/fiddler/
案例 3

要求離開用戶端之後有可能會影響所送出的封包的各層。若要判斷網路裝置是否正在移除 Cookie,您必須擷取網路追蹤用戶端和在伺服器上,然後尋找要求的 Cookie 的主體中。您想要查看用戶端的要求,以確定已傳送 Cookie,] 及 [檢查伺服器追蹤,以確定伺服器收到 Cookie。

用戶端要求

驗證使用者之後,這是 GET 要求。表單驗證票證資訊是以藍色提示。這可確認 Cookie 資訊保留在用戶端。When you use a network capture tool, like Netmon, you see the traffic that actually went through the adapter.
47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb
Server-side request

當您查看到達伺服器的要求時,您想確定伺服器收到相同用戶端傳送的資訊。如果伺服器未收到相同的資訊,需要調查來判斷移除了 Cookie 網路上的其他裝置。

附註也已經移除 Cookie 的 ISAPI 篩選器的執行個體。如果確認 Web 伺服器收到該 Cookie,但 IIS 記錄檔中未列出該 Cookie 檢查 ISAPI 篩選器。您可能必須移除篩選以便查看問題是否已經解決。

表單驗證票證逾時

重新導向使用者的其他常見原因是如果表單驗證票證已經過期。表單驗證票證可以兩種方式的逾時時間。如果您使用絕對到期,就會發生第一個案例。具有絕對有效期限驗證票證到期到期時間到期時。例如,設定到期日的 20 分鐘,而使用者造訪該網站下午 2: 00。使用者將被重新導向至登入網頁,如果使用者造訪該網站之後下午 2: 20。

如果您使用 [滑動期限,案例是有點複雜。如果使用者造訪網站,到期時間是半過期之後,會更新 Cookie] 及 [產生的票證。比方說,您利用滑動期限設定 20 分鐘的到期日。使用者造訪該網站 2: 00 PM 時及使用者接收設定為 [下午 2: 20 過期的 Cookie。如果使用者造訪網站 2: 10 PM 後,只會更新到期日。如果使用者造訪該網站下午 2: 09,票證是不會更新,因為有一半的到期時間不已經過了。如果 12 分鐘下午 2: 21 造訪網站,然後在等待使用者,將會過期票證。使用者重新導向至登入網頁。

單向方法這種問題是要記錄的表單驗證 Cookie 和票證資訊。如此一來您可以看到是否 Cookie 所收到 IIS 和值為何。您可以只要撰寫一個 HttpModule 中,然後插入該模組至要求管線。您不會修改應用程式的程式碼,以取得您需要的資訊。

附加的範例適用於 Microsoft.NET Framework 1.1 和.NET Framework 2.0,並且有整個註解。這個範例包括下列檔案:
  • FormsAuthEvents.cs: 實作 IHttpModule 並繫結到 Application_BeginRequest 事件的類別。
  • FormsAuthInfo.cs: 會擷取 Cookie 並解密表單驗證票證的類別。它也會檢查應用程式的 Web.config 檔,以確保的表單驗證已啟用。
  • FormsAuthConfig.cs: 從 FormsAuthLogger.config 檔案讀取資訊的類別。
  • Log.cs: 的檔案,會接受一個 stringbuilder 並將值寫出至記錄檔。
  • FormsAuthLogger.config: 的 XML 檔案讀取 Log.cs 檔案所。這個檔案,都必須與建造 DLL 的/bin 資料夾中。檔案可讓您設定下列:
    • 依 IP 篩選器: 您可以篩選由用戶端 IP 資料擷取。如此一來您可以從已知重現問題的用戶端記錄只要求。這可減少記錄檔的大小。
    • 擷取類型: 這會指定要用來儲存檔案的位置。預設值為 [暫存 ASP.NET 檔案] 資料夾,但您可以儲存這任何一處,只要背景工作處理序帳戶有權寫入資料夾。
附註我將提供 FormsAuthLogger.zip 檔案所提供的程式碼的下載連結。

我會指出主要的區域:
  1. 建立一個類別,它會實作
    public class FormsAuthEvents : IHttpModule 
    {
    		…code…
    }
    IHttpModule 介面。
  2. 電傳往您要查看的事件上。這個範例中我們將使用 [Application_BeginRequest 事件]。我們可以調查每一個這種方式要求,並判定它是否有表單驗證 Cookie 並記錄 FormsAuthenticationTicket,如果 Cookie 是
    public void Init(HttpApplication application) 
    {
    	//Wire up the BeginRequest event
    	application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
    那裡。
  3. 實作 Application_BeginRequest 事件
    private void Application_BeginRequest(Object source, EventArgs e)
    {	
       …code to log the ticket…
    }
    
  4. 取得表單驗證 Cookie,然後將其解密。
  5. 記錄值。我會建議記錄下列項目以表單資訊之外。這將會幫助您對齊 「 IIS 記錄檔到您的表單驗證資訊,如有必要:
    • 日期: 可讓您要求附帶時看到。
    • RequestType: 顯示要求是以 Get 或 Post。
    • URL: 顯示要求導致問題的模式。
    • 參考
    • ClientIP: 繫結至特定的用戶端要求中。
如需有關表單驗證的詳細資訊,您可以下載下列 FormsAuthLogger 範例檔案:
摺疊此圖像展開此圖像
Download
Download the FormsAuthLogger.exe package now.

如往常請隨意送出您想要在將來解決資料行的主題或使用 Ask For It 表單的知識庫中的想法。

屬性

文章編號: 910439 - 上次校閱: 2007年5月31日 - 版次: 1.5
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 2.0
關鍵字:?
kbmt kbtshoot kbiis kbcode kbasp KB910439 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:910439
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見