2013-01-02 47 views
1

在我的應用程序,這是我們如何處理會話超時至今如何在JavaScript中處理MVC3中的會話超時?

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogOn" timeout="20" /> 
</authentication> 

現在我要處理會話超時在客戶端,像這樣

<authentication mode="Forms"> 
    <forms loginUrl="showPopup();" timeout="20" /> 
</authentication> 

是可能的,或任何其他建議的方式來實現這一目標?

編輯

我參觀了同類型的其他問題,但不能從他們那裏得到任何實際的幫助。

回答

0

此配置區域用於配置服務器端行爲,當服務器嘗試處理會話已過期的請求時發生。這是客戶端 - >服務器請求頁面的結果。由於客戶端是一個Web瀏覽器,並且在設計上與服務器斷開連接,所以您必須在每個頁面中包含您需要的邏輯(可能位於主佈局模板中),然後以重複的間隔向服務器發送AJAX調用以確定用戶會話超時狀態。彈出窗口也將在客戶端處理。

這方面的配置可能不會幫助您達到目標,我只是完全刪除<forms>元素,並着眼於解決使用AJAX調用服務器的問題。

2

在我的應用程序,這是我們如何處理會話超時至今

大,這是在web.config中定義窗體身份驗證的正確方法

這是可能的

不,對不起,將javascript放在loginUrl屬性中是沒有意義的。

或其他任何建議的方式來實現這一目標

從我瞭解你正在嘗試使用一些JavaScript函數來顯示登錄表單,如果會話已過期。

你應該兩種類型的請求區分到您的服務器:

  1. 標準同步請求(錨,形式,重定向,...)
  2. 異步請求(AJAX - 通過使用JavaScript實現)

在服務器端的這兩種情況下,您都應該通過使用[Authorize]屬性修飾它們來保護需要身份驗證的操作。例如:

[Authorize] 
public ActionResult SomeAction() 
{ 
    ... 
} 

一旦你已經獲得你的服務器,你可以開始思考如何處理窗體身份驗證cookie到期或匿名用戶試圖調用這個動作的簡單情況。

對於標準同步調用服務器的第一種情況,表單身份驗證模塊將攔截請求,如果用戶未通過身份驗證或者會話過期,ASP.NET會自動將您重定向到您已定義的LogOn頁面loginUrl屬性。它也將作爲ReturnUrl查詢字符串參數傳遞給此操作,該操作將指向用戶原先請求的url並且尚未授權他。這個參數可以用來在他認證之後將他重定向回這個頁面。

現在第二種情況有點困難,因爲ASP.NET自動將請求重定向到LogOn頁面,您無法知道AJAX成功回調中用戶未被授權,並且服務器將請求重定向到LogOn頁面。菲爾哈克寫了一個excellent article關於如何防止這種重定向的AJAX請求。我邀請你現在閱讀這篇文章。

好了,現在你已經閱讀文章,並且已經安裝了他的NuGet(Install-Package AspNetHaack),你使用jQuery您的AJAX請求假設,你可以訂閱.ajaxComplete()全局事件處理程序。在這個處理程序中,您可以測試服務器響應代碼,如果它是401,則表示該用戶未被授權。所以,你可以採取相應的行動。

<script type="text/javascript"> 
    $(document).ajaxComplete(function(event, xhr, ajaxOptions) { 
     if (xhr.status == 401) { 
      // the AJAX request failed because either the user was not 
      // authenticated or his session expired. So here you could 
      // do whatever you want. For example you could redirect him 
      // to the loginUrl defined in your web.config file: 

      window.location.href = '@FormsAuthentication.LoginUrl'; 

      // you also have the possibility to show this logon form 
      // inside a popup or render it inline inside the page, 
      // by sending an AJAX request to this action and retrieving the 
      // corresponding partial 
     } 
    }); 
</script> 
+0

感謝@Darin,其實我不允許:(我想我的問題也可以,如果我能先手運行定時器sitewise的方式解決使用包它應該無論當前打開哪個頁面,都可以在_layout.cshtml頁面中持續運行。 –

+0

如果您不允許使用該軟件包,那麼只需從軟件包中獲取代碼並將其添加到你的項目,它是一個單一的文件。 –