2013-11-04 100 views
3

在我的ASP.NET應用程序MVC4,我使用窗體身份驗證。應用程序中的一個視圖需要通過jQuery post()調用獲取一些字符串數據。我寫了一個返回字符串的動作。一切正常,直到表單身份驗證票證過期。到期後,AJAX調用的字符串操作結果如下:MVC4窗體身份驗證+ AJAX行動

  • 行動中的代碼沒有得到執行
  • 操作返回一個HTTP 200,而不是401
  • 操作返回的HTML登錄查看串
  • 因爲200點的狀態返回,而不是401,控制在jqXHR.done()代替jqXHR.fail()

這是預期的行爲結束了?我能做些什麼讓行動回到401嗎?還是有什麼我應該做的來處理這件事?

回答

0

是的,這是預期的行爲。

在Asp.Net 4.5 HttpResponse.SuppressFormsAuthenticationRedirect Property已添加。但是默認行爲仍然是重定向到登錄頁面。從MSDN:

默認情況下,窗體身份驗證會將HTTP 401狀態代碼轉換爲302以重定向到登錄頁面。這不適用於某些類型的錯誤,例如身份驗證成功但授權失敗,或當前請求是AJAX或Web服務請求時。該屬性提供了一種抑制重定向行爲並將原始狀態碼發送給客戶端的方法。

你可以使用這個屬性或this answer嘗試以下解決方法:

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 
} 

或者你可以看看這個問題的答案:Forms authentication: disable redirect to the login page並選擇適合你返回一個401的方法。

+0

感謝您的回答。從我檢查的內容來看,字符串動作中的任何代碼都不會被執行。那麼我應該在哪裏插入這行代碼'HttpResponse.SuppressFormsAuthenticationRedirect = true'? – joym8

+0

在Application_EndRequest()中,如果將其添加到global.asax中,它將被自動調用。 –

+0

或者你可以ofcourse創建ActionFilterAttribute:http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs –

5

請辭Application_EndRequest()的代碼,我沒有工作。這是在我的情況是什麼在起作用:

protected void Application_BeginRequest() 
    { 
     HttpRequestBase request = new HttpRequestWrapper(Context.Request); 
     if (request.IsAjaxRequest()) 
     { 
      Context.Response.SuppressFormsAuthenticationRedirect = true; 
     } 
    } 
+0

這是迄今爲止最乾淨的解決方案。我用這個片段解決了我最初在ServiceStack.NET上指責的一個相同的問題。希望我在2小時前發現了這個! –