MSDN明確表示它應該執行401重定向,但是我在FF上獲得了302重定向,並且這導致AJAX請求中的問題返回狀態是200(來自重定向頁面)。當用戶未被授權時,ASP.NET MVC授權屬性會執行302重定向
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我發現別人用了同樣的問題: http://blog.nvise.com/?p=26
任何其他解決辦法,除了他的?
MSDN明確表示它應該執行401重定向,但是我在FF上獲得了302重定向,並且這導致AJAX請求中的問題返回狀態是200(來自重定向頁面)。當用戶未被授權時,ASP.NET MVC授權屬性會執行302重定向
http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx
我發現別人用了同樣的問題: http://blog.nvise.com/?p=26
任何其他解決辦法,除了他的?
授權屬性確實返回一個Http 401未經授權的響應。不幸的是,如果啓用了FormsAuthentication,則401被FormsAuthenticationModule攔截,然後執行重定向到登錄頁面 - 然後將Http 200(和登錄頁面)返回到您的ajax請求。
最好的選擇是編寫自己的授權屬性,然後如果你得到一個未經身份驗證的請求,這也是一個Ajax請求,返回一個不同的Http狀態代碼 - 比如說403--它不被formsAuthenticationModule捕獲,你可以抓住你的Ajax方法。
我非常喜歡這個解決方案。通過將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;
}
}
});
});
如果您使用的是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未授權狀態代碼,並且在登錄發生時它不會自動重定向 。
代碼爲我完美工作。謝謝。 – njr101 2012-06-14 11:25:32
這是一個不好的做法,因爲所有的請求都應該在EndRequest中進行chelic,包括所有的靜態文件。 – 2014-06-07 14:01:08
它是如此悲傷,處理這個'最好'的方式涉及劫持所有ajax 302s – 2015-12-09 01:38:16