2010-07-13 172 views
1

我通過$ .ajax()獲取部分視圖,並且在您將空閒設置爲30分鐘然後嘗試獲取該部分視圖的情況下,表單身份驗證已超時,而不是獲取我的部分觀點返回給我,我得到的登錄頁面渲染到我的。部分視圖渲染表單超時

關於如何處理這種情況的任何建議?

謝謝。

$(function() { 
    $("#addContact").click(function() { 
     $.get('/Contacts/Add', function (data) { 
      $("#content").html(data); <--gets login page as data 
     }); 
    }); 
}); 

回答

2

您的Add Action是否有任何非Ajax使用者?如果沒有,我建議從操作中刪除[Authorize]屬性,這將消除超時重定向問題。 (如果你的整個控制器使用[Authorize]進行修飾,那麼你需要刪除控制器級別的屬性並修飾所有其他動作。令人討厭的是,我知道)。

爲了提高安全性,您可以這樣做,以防止非Ajax調用調用您的Add操作。

public ActionResult Add() 
    { 
     if (Request.IsAjaxRequest()) 
      return View("Error"); 

     return View(); 
    } 

如果,另一方面,你Add動作需要支持Ajax的正常呼叫,可以解決這一問題的方法之一是創建一個從繼承並重寫AuthorizeAttribute新屬性類。退房源指導:http://aspnet.codeplex.com/SourceControl/changeset/view/23011#266447

您應該能夠通過重寫AuthorizeCore方法做的伎倆,像這樣

public class AjaxAuthorizeAttribute: AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
    { 
     if (httpContext.Request.IsAjaxRequest()) 
      return true; 

     return base.AuthorizeCore(httpContext); 
    } 
} 

現在您可以在控制器和/或動作上使用[AjaxAuthorize]

要清楚的是,您在這裏所做的是在用戶通過Ajax發起呼叫時給予用戶超時延長。一旦他們刷新頁面,或離開,他們會被提示重新登錄,正常情況下。

希望有所幫助。如果遇到任何問題,請告知我。

-1

這取決於您是否可以改變用戶登錄的時間長度。如果你是,你可以改變你的配置文件,如下所示...

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="512640" /> 
</authentication> 

這將保持用戶登錄一年。如果更改用戶登錄時間的時間不是一個選項,則需要處理ajax響應並再次將用戶重定向到登錄表單。

+0

我不能這樣做。我們的安全政策規定超時時間不超過30分鐘。 – 2010-07-14 02:08:00

0

在進行Ajax調用之前,您是否可以讓另一個未授權的控制器來確保用戶已通過身份驗證?如果是,請繼續照常,否則您可以顯示登錄燈箱,以便您不離開網頁並保持用戶體驗。

0

另一種解決方案是將一些腳本添加到您的登錄頁面,以檢查它是否在彈出框中呈現。如果是,您可以使用location.href()將整個頁面重定向到登錄頁面。