2011-07-31 33 views
6

Trong dự án MVC3 của tôi, tôi có một bộ điều khiển có thuộc tính [Authorize]. Tôi có một biểu mẫu gửi mà không cần ajax, chuyển hướng người dùng (như mong đợi) đến màn hình đăng nhập, nếu anh ta/cô ấy không đăng nhập.mvc 3, jquery ajax & xác thực biểu mẫu

Tuy nhiên, bây giờ tôi có một biểu mẫu được gửi với jquery ajax và làm thế nào tôi có thể làm điều tương tự? Chuyển hướng người dùng đến màn hình đăng nhập, nếu người đó không được ủy quyền? Sau khi đăng nhập thành công, người dùng nên được chuyển hướng đến hành động ban đầu.

khiển

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

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

jQuery Khách hàng

$(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; 
    }); 
}); 

tôi có thể nhìn thấy từ bảng điều khiển firebug cửa sổ, server đó trả về:

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

Mong sự giúp đỡ của bạn !

CẬP NHẬT với giải pháp khả thi

+0

điểm của thông tin đăng nhập AJAX nếu bạn chỉ định chuyển hướng là gì? Tại sao không chỉ sử dụng một hình thức thông thường? – RPM1984

+0

Vấn đề là, người dùng đã đăng nhập sẽ có thể gửi một số dữ liệu đến bộ điều khiển bằng ajax. Phải làm gì, nếu họ không đăng nhập? Làm thế nào để xử lý kịch bản đó với jquery ajax? – Nima

+0

đúng, xấu của tôi - tôi đã hiểu lầm. Đã thêm câu trả lời. – RPM1984

Trả lời

6

Vâng, đây là một trong những điều tôi luôn luôn ghét về Xác thực biểu mẫu trong ASP.NET - không phục vụ cho xác thực AJAX. Thêm IIS xử lý 401 vào hỗn hợp, và nó có thể là một nỗi đau.

Có một số cách để thực hiện việc này, không có cách nào trong số đó có thể "sạch".

Chúng bao gồm:

  1. Đặt một lá cờ ViewBag trong bộ điều khiển, tương ứng với Request.IsAuthenticated, sau đó viết lại sự kiện nút gửi nhấp chuột vào trang đăng nhập nếu họ không chứng thực.

  2. Thực hiện trả lại hành động AJAX JsonResult, thuộc tính cho "mã". Trong trường hợp mã 0 có thể thành công, 1 có thể không được xác thực, 2 có thể là một số vấn đề dữ liệu khác, v.v. Sau đó kiểm tra mã đó trong cuộc gọi lại complete$.ajax và chuyển hướng đến trang đăng nhập.

  3. Kiểm tra đối tượng phản hồi $.ajaxjqXHR cho mã trạng thái 403 và chuyển hướng đến trang đăng nhập.

  4. Viết trình trợ giúp HTML tùy chỉnh cho nút gửi của bạn, nút này hiển thị nút gửi thông thường hoặc thẻ liên kết đến trang đăng nhập, tùy thuộc vào trạng thái xác thực.

  5. Viết thuộc tính ủy quyền tùy chỉnh kiểm tra xem Request.IsAjaxRequest() và trả về đối tượng JSON tùy chỉnh thay vì hành vi mặc định chuyển hướng đến trang đăng nhập (điều này không thể xảy ra với yêu cầu AJAX).

+0

Cảm ơn các giải pháp khác nhau. Tôi sẽ cập nhật câu hỏi của tôi với các bài đăng khác liên quan đến câu trả lời của bạn, cung cấp mô tả chi tiết hơn về các giải pháp khác nhau. – Nima

+0

Bạn có thể thực hiện chuyển hướng để thực hiện hành động (tới một thời gian chờ phiên hoặc màn hình đăng nhập?), Trong hàm C#, nếu người dùng chưa đăng nhập? – nagates

0

Đó là một chút đau đớn, phải trung thực. Thậm chí nhiều hơn như vậy, theo ý kiến ​​của tôi, nếu bạn đang sử dụng Identity liên kết, chẳng hạn như Windows Identity Foundation và/hoặc Azure AppFabric Access Control Service.

Cuộc gọi Ajax của bạn không thể xử lý chuyển hướng. Giải pháp/đề xuất của tôi không phải là để đánh dấu các phương thức hành động của trình điều khiển gọi Ajax bằng [Ủy quyền], mà thay vào đó, hãy dựa vào sự hiện diện của một số giá trị mà bạn chèn vào Trạng thái phiên từ một hành động điều khiển có [Ủy quyền] (thường là phương thức hành động của bộ điều khiển được gọi để hiển thị khung nhìn). Bạn biết rằng giá trị không thể vào Trạng thái phiên trừ khi người dùng được xác thực (và phiên không hết thời gian chờ). Không thực hiện được cuộc gọi đến phương thức Ajax của bạn nếu giá trị này không có, trả về một kết quả JSON cụ thể mà bạn có thể xử lý một cách duyên dáng trong mã phía máy khách của bạn.

Sử dụng [Ủy quyền] trên phương pháp điều khiển Ajax gây ra các lỗi lạ, thường bị ẩn, (chẳng hạn như cập nhật biến mất).

+0

Bạn nói đúng, đó là một nỗi đau. Nó thực sự là một giải pháp tốt để sử dụng trạng thái phiên, tôi sẽ xem xét điều đó. – Nima

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