2011-07-31 139 views
6

在我的MVC3項目中,我有一個具有[Authorize]屬性的控制器。 我有一個表單提交沒有AJAX,重定向用戶(如預期)登錄屏幕,如果他/她沒有登錄。mvc 3,jquery ajax&表單身份驗證

但是,現在我有一個表單提交與jquery ajax和我怎麼能做同樣的事情?將用戶重定向到登錄屏幕(如果他/她未被授權)?成功登錄後,用戶應該重定向到初始操作。

控制器

[Authorize] 
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message) 
     { 
      if (!string.IsNullOrEmpty(message)) 
      { 
       // Do stuff 
      } 

      // Return all chat messages 
      return GetChatMessages(); 
     } 

客戶JQUERY

$(document).ready(function() { 
    $("form[action$='SubmitChatMessage']").submit(function (event) { 
     $.ajax({ 
      url: $(this).attr("action"), 
      type: "post", 
      dataType: "json", 
      data: $(this).serialize(), 
      success: function (response) { 
       // do stuff 
      } 
     }); 
     return false; 
    }); 
}); 

我可以從Firebug的控制檯窗口中看到,服務器返回:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage 

期待您的幫助!

更新了可能的解決方案

+0

如果您只是在做重定向,那麼AJAX登錄有什麼意義呢?爲什麼不使用常規表單? – RPM1984

+0

問題是,登錄用戶應該能夠使用ajax將一些數據提交給控制器。如果他們沒有登錄,該怎麼辦?如何用jquery ajax處理這個場景? – Nima

+0

對,我的壞 - 我誤解了。答案已添加。 – RPM1984

回答

6

是的,這是我一直想要的東西之一討厭關於ASP.NET中的表單身份驗證 - 根本不支持AJAX身份驗證。添加IIS處理401的混合,這可能是一個相當痛苦。

有幾種方法可以做到這一點,它們都不是特別「乾淨」的。

這些措施包括:

  1. 設置控制器,這相當於一個Request.IsAuthenticated標誌ViewBag,那麼如果他們沒有身份驗證的重新編寫提交按鈕點擊事件到登錄頁面。

  2. 使您的AJAX操作返回JsonResult,它是「代碼」的屬性。如果0的代碼可以成功,則1可以是未認證的,2可以是其他數據問題等。然後檢查complete$.ajax回調中的代碼並重定向到登錄頁面。

  3. 檢查$.ajaxjqXHR響應對象的狀態碼爲403,並重定向到登錄頁面。

  4. 爲您的提交按鈕編寫自定義HTML幫助程序,該按鈕可呈現常規提交按鈕或轉到登錄頁面的定位標記,具體取決於身份驗證狀態。

  5. 編寫一個自定義授權屬性,它檢查Request.IsAjaxRequest()是否會返回一個自定義JSON對象,而不是重定向到登錄頁面的默認行爲(對於AJAX請求不會發生這種情況)。

+0

感謝您的不同解決方案。我將更新我的問題與其他與您的答案相關的帖子,以更詳細地描述不同的解決方案。 – Nima

+0

如果用戶沒有登錄,您可以在C#函數中重定向到操作(會話超時或登錄屏幕?)嗎? – nagates

0

這是一個有點痛,是誠實的。更重要的是,在我看來,如果您使用的是聯合身份驗證,例如Windows Identity Foundation和/或Azure AppFabric訪問控制服務。

您的Ajax調用無法處理重定向。

我的解決方案/建議不是用[Authorize]標記Ajax調用的控制器操作方法,而是依賴於存在一些從控制器操作插入到會話狀態的值,該操作具有[授權] (通常是調用顯示視圖的控制器操作方法)。您知道,除非用戶已通過身份驗證(並且會話尚未超時),否則該值無法進入會話狀態。如果此值不存在,則將對該Ajax方法的調用失敗,並返回可在客戶端代碼中正常處理的特定JSON結果。

在Ajax控制器方法上使用[Authorize]會導致奇怪的,經常隱藏的錯誤(例如更新消失)。

+0

你是對的,這是一種痛苦。這實際上是一個使用會話狀態的好方案,我會考慮的。 – Nima