2011-05-09 130 views
2

我有一個使用表單身份驗證的asp網絡應用程序。我沒有使用asp.net成員資格提供程序,我正在創建自定義身份驗證。因此,當用戶登錄時,我爲他創建了一張票和一個cookie,當用戶註銷時,我將其刪除。 當用戶單擊瀏覽器右上角的關閉按鈕時出現問題。因爲您知道這是客戶端事件,並且沒有運行的服務器端事件。
我的問題是:
當用戶點擊關閉按鈕以刪除票證和Cookie時,我該怎麼辦?asp.net應用程序身份驗證問題

回答

0

您應該使用非持久性cookie。您可以通過將false傳遞給此方法的第二個參數來執行此操作:http://msdn.microsoft.com/en-us/library/twk5762b.aspx

+0

該問題提到,除了cookie之外,還需要刪除票證。您的解決方案將無法處理該情況。 – Nikhil 2011-05-09 14:22:13

+0

我假設票是在cookie中。這是表單身份驗證的工作方式。更重要的是,如果他真正使用表單身份驗證,並且只實現了後端機制(即他正在使用FormsAuthentication類),那麼這只是切換的一個參數。如果他沒有使用FormsAuthentication類,我敢打賭他錯了:) – Stilgar 2011-05-09 14:28:46

+1

我想@Ghyath Serhal會在數據庫表中或者其他任何可以知道某個會話處於活動狀態的內容中調用「ticket」標誌,文件,記錄。該會話過期後,該「票證」將被刪除/失效。我錯了嗎 ? – Larry 2011-05-09 14:47:40

0

您可以掛接到「onbeforeunload」DOM事件。有幾個辦法可以採取

  1. 從客戶端設置一個隱藏字段的值,並調用__doPostBack(「fieldid」)。在此字段的值chagned事件的服務器端事件處理程序中,刪除故障單和您的身份驗證令牌。你可以把它作爲ajax回發。 Teh的想法是,即使用戶關閉瀏覽器,您的Web服務器也會被擊中,並且您將刪除令牌。

  2. 在相同的事件處理程序中觸發Web服務調用來刪除身份驗證令牌。

+1

雖然你必須小心使用IE,但是有一個onbeforeunload事件處理程序有時會導致代碼在每次單擊超鏈接時觸發事件處理程序。要解決此問題,您可以執行類似if($ .browser.msie) $('a')。live('click',function(){ var a = 1; document.ignoreUnload = document。 ignoreUnload || $ .inArray(this.id,Sys.WebForms.PageRequestManager.getInstance()。_asyncPostBackControlClientIDs)> -1; }); – Nikhil 2011-05-09 14:13:52

+0

你真的建議這樣做只是爲了刪除cookie嗎? – Stilgar 2011-05-09 14:14:09

+0

這個想法是簡單地捕獲瀏覽器closign事件,並在服務器上發起服務器端調用以進行任何必要的處理。這可能是真的。所以我給了一個通用的解決方案。 – Nikhil 2011-05-09 14:20:05

0

我想你會在用戶會話過期或結束時立即刪除票證,在服務端使用session.Abandon()和session_end事件。

就我而言,我會等到超時自動關閉會話並使用ASP.NET會話過期機制。顯然你不想依賴它,這就是爲什麼你需要以某種方式捕捉「窗口關閉」事件並向服務器發送信號。

This link可能會幫助您舉例說明如何做到這一點。

+0

好的。在投票時,政治正在增加評論,所以......等待評論。 – Larry 2011-05-09 14:36:32

+0

除非創建爲持久性,否則Cookie在瀏覽器關閉時自動刪除。在客戶端和服務器端都不需要任何事件。這就是持久性cookie意味着「瀏覽器關閉後應該保留」。如果期望的行爲是在瀏覽器關閉時刪除cookie,則將其創建爲非持久性,否則將創建一個持久cookie。 – Stilgar 2011-05-09 14:39:38

+0

你對非持久性cookies是正確的。無論如何,@Ghyath Serhal的想法是關閉服務器端的會話,而不依賴超時機制。這裏的問題是,無論cookie發生在客戶端,無論持久與否,服務器端的會話都必須在客戶端窗口關閉時關閉。在服務器端關閉會話非常重要,因爲資源和內容可能已被分配並需要發佈。 – Larry 2011-05-09 14:43:31