2010-10-20 51 views

回答

9

授權屬性確實返回一個Http 401未經授權的響應。不幸的是,如果啓用了FormsAuthentication,則401被FormsAuthenticationModule攔截,然後執行重定向到登錄頁面 - 然後將Http 200(和登錄頁面)返回到您的ajax請求。

最好的選擇是編寫自己的授權屬性,然後如果你得到一個未經身份驗證的請求,這也是一個Ajax請求,返回一個不同的Http狀態代碼 - 比如說403--它不被formsAuthenticationModule捕獲,你可以抓住你的Ajax方法。

12

我非常喜歡這個解決方案。通過將ajax請求上的302響應更改爲401,它允許您在客戶端設置您的ajax,以監控尋找401的任何ajax請求,以及是否找到一個重定向到登錄頁面的ajax請求。非常簡單而有效。

的Global.asax:

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

客戶端代碼:

$(function() { 
     $.ajaxSetup({ 
     statusCode: { 
      401: function() { 
      location.href = '/Logon.aspx?ReturnUrl=' + location.pathname; 
      } 
     } 
     }); 
    }); 
+0

代碼爲我完美工作。謝謝。 – njr101 2012-06-14 11:25:32

+3

這是一個不好的做法,因爲所有的請求都應該在EndRequest中進行chelic,包括所有的靜態文件。 – 2014-06-07 14:01:08

+1

它是如此悲傷,處理這個'最好'的方式涉及劫持所有ajax 302s – 2015-12-09 01:38:16

2

我實現了從AuthorizeAttribute繼承和遇到同樣的問題,我自己的自定義授權屬性。

後來我發現,自.NET 4.5有到了一個解決方案 - 可以抑制以下列方式重定向:

context.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 

那麼響應將是一個401 - 未經授權,與沿HTTP基本身份驗證挑戰。

更多信息here

+0

這應該是被接受的答案。 – icesar 2018-01-16 17:44:21

0

如果您使用的是ASP.NET MVC 5 Web應用程序去App_Start - >Startup.Auth.cs。檢查是否啓用了app.UseCookieAuthentication,並查看CookieAuthenticationOptions是否設置爲LoginPath = new PathString("/Login"),或類似。如果您刪除此參數401將停止重定向。

描述爲LoginPath

的LOGINPATH屬性通知它應改變 傳出401 Unauthorized狀態代碼到302重定向到 給定的登錄路徑的中間件。生成401的當前url被添加到 LoginPath作爲由 ReturnUrlParameter命名的查詢字符串參數。一旦對LoginPath的請求授予新的登錄身份,ReturnUrlParameter值將用於將 瀏覽器重定向到導致原始未授權狀態 代碼的url。如果LoginPath爲空或空,中間件將不會查找 401未授權狀態代碼,並且在登錄發生時它不會自動重定向 。