2010-10-20 39 views
11

MSDN nói rõ ràng là chuyển hướng 401, nhưng tôi nhận được chuyển hướng 302 trên FF và điều này gây ra sự cố trong yêu cầu AJAX trạng thái là 200 (từ trang được chuyển hướng).ASP.NET MVC Authorize Attribute thực hiện chuyển hướng 302 khi người dùng không được ủy quyền

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

Tôi đã tìm thấy một người nào đó khác với cùng một vấn đề: http://blog.nvise.com/?p=26

Bất kỳ giải pháp khác, bên cạnh mình?

Trả lời

9

Thuộc tính ủy quyền không trả về một Http 401 Phản hồi trái phép. Thật không may, tuy nhiên nếu bạn đã kích hoạt FormsAuthentication, 401 bị chặn bởi FormsAuthenticationModule, sau đó thực hiện chuyển hướng đến trang đăng nhập - sau đó trả về một Http 200 (và trang đăng nhập) trở lại yêu cầu ajax của bạn. Thay thế tốt nhất là viết thuộc tính ủy quyền của riêng bạn, và sau đó nếu bạn nhận được yêu cầu chưa được xác thực cũng là yêu cầu Ajax, hãy trả lại mã trạng thái Http khác - giả sử 403 - không bị bắt gặp bởi formsAuthenticationModule và bạn có thể nắm bắt phương pháp Ajax của bạn.

12

Tôi thực sự thích giải pháp này. Bằng cách thay đổi đáp ứng 302 trên yêu cầu ajax thành 401, nó cho phép bạn thiết lập ajax ở phía máy khách để theo dõi bất kỳ yêu cầu ajax nào tìm kiếm 401 và nếu nó tìm thấy một chuyển hướng đến trang đăng nhập. Rất đơn giản và hiệu quả.

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; 
    } 
} 

Client Side Code:

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

Mã hoạt động hoàn hảo cho tôi. Cảm ơn. – njr101

+3

Đây là một thực hành không tốt, vì tất cả yêu cầu nên được cheched trong EndRequest, bao gồm tất cả các tệp tĩnh. –

+1

Thật buồn khi 'cách tốt nhất' để giải quyết vấn đề này liên quan đến việc cướp tất cả ajax 302s –

2

Tôi thực hiện riêng thuộc tính tùy chỉnh ủy quyền của tôi mà thừa hưởng từ AuthorizeAttribute và chạy vào cùng một vấn đề.

Sau đó, tôi phát hiện ra rằng kể từ Net 4.5 có một giải pháp cho điều này - bạn có thể ngăn chặn sự chuyển hướng theo cách sau:

context.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; 

Sau đó, câu trả lời sẽ là một 401 - Unauthorized, cùng với Thách thức xác thực HTTP cơ bản.

Thông tin thêm here

+0

Đây phải là câu trả lời được chấp nhận. – icesar

0

Nếu bạn đang sử dụng một ASP.NET MVC Web Application 5 đến App_Start ->Startup.Auth.cs. Kiểm tra xem app.UseCookieAuthentication có được bật hay không và xem nếu CookieAuthenticationOptions được đặt thành LoginPath = new PathString("/Login"), hoặc tương tự. Nếu bạn xóa thông số này 401 sẽ ngừng chuyển hướng.

Description for LoginPath:

Thuộc tính LoginPath thông báo cho middleware rằng nó nên thay đổi một đi 401 mã trạng thái trái phép vào một chuyển hướng 302 vào con đường đăng nhập cho . Url hiện tại tạo 401 được thêm vào đối tượng LoginPath dưới dạng thông số chuỗi truy vấn được đặt tên theo thông số ReturnUrlParameter.Khi yêu cầu LoginPath cấp một mã nhận dạng Đăng nhập mới, giá trị ReturnUrlParameter được sử dụng để chuyển hướng trình duyệt trở lại url khiến mã trạng thái trái phép ban đầu . Nếu LoginPath là null hoặc rỗng, phần mềm trung gian sẽ không xem cho 401 mã trạng thái trái phép và nó sẽ không tự động chuyển hướng khi đăng nhập xảy ra.

Các vấn đề liên quan