2013-07-10 27 views
0

我有一個MVC應用程序,它使用大量的Ajax請求來獲取和張貼頁面上的div內的表單。然而,我偶然發現了我已經修復的經典Ajax超時問題創建一個自定義的Authorize屬性,它只是返回一個401,它允許我通過Jquery重定向到登錄頁面(這一切都很好,很好)。在會話過期後處理POST上的ReturnUrls MVC3

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Items["AjaxRequestPermissionDenied"] = true; 

      } 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

但是當我做一個表單的正常服務器端提交時,會話已過期,我重定向到登錄表單正常的,但與形式參數在URL即 Login/Login.aspx?ReturnUrl=%2fTest%2fComp%2fSite%2f4。 因此,當我重新登錄時,無法將表單重新插入所需的div中,因爲這是最初調用它的頁面中的一個單獨URL。

接下來的問題是,我將如何處理這種情況,以便我們總是重定向到默認的登錄頁面,或者最好是重定向到帶有指向登錄頁面的鏈接的generac Timeout頁面?

回答

0

問題在於如果引發401異常,ForsmAuthentication模塊會自動重定向到SignIn表單。 Phil Haack blogged關於如何覆蓋AJAX請求的這種行爲。

所以一旦你安裝的NuGet你可以簡單地訂閱到你的AJAX的401錯誤調用:

$.ajax({ 
    url: '/admin/secret/data', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    statusCode: { 
     200: function (data) { 
      alert('200: Authenticated'); 
      // Bind the JSON data to the UI 
     }, 
     401: function (data) { 
      alert('401: Unauthenticated'); 
      // Handle the 401 error here. 
     } 
    } 
}); 

或通過訂閱全球.ajaxError()處理程序,並檢查返回代碼做通用於所有的AJAX請求從服務器,如果它是401會話已過期,你可以採取相應的行動。

+0

感謝達林。我已經排序了Ajax位。我遇到的問題是經典的asp.net表單提交(通過Submit buitton),在會話超時時具有值。我得到一個重定向到登錄頁面,但它帶回了參數,這是與表單身份驗證的默認行爲。我想排除返回Url? – lacoder