2011-11-09 44 views
5

Chúng tôi có trang web sử dụng MVC3 và phương thức xác thực tùy chỉnh không dựa vào xác thực biểu mẫu - ít nhất là từ những gì tôi có thể biết. Trong web.config, chúng tôi đặtAntiForgeryToken không có xác thực biểu mẫu

<authentication mode="None"></authentication> 

và chúng tôi không bao giờ sử dụng/đặt HttpContext.User ở bất kỳ đâu trong mã. Vấn đề là khi sử dụng @ Html.AntiForgeryToken() trong một số trường hợp người dùng được thông báo lỗi này:

A required anti-forgery token was not supplied or was invalid 

Chúng tôi tập trung tất cả kiểm tra chống giả mạo trong OnAuthorization với mã này:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0) 
{ 
    var forgery = new ValidateAntiForgeryTokenAttribute(); 
    forgery.OnAuthorization(filterContext); 
} 

Đó là nơi ngoại lệ xảy ra. Chúng tôi có defined a machineKey in web.config để ngăn các khóa mới được tạo khi nhóm ứng dụng tái chế. Điều này không khắc phục được vấn đề.

Tiếp theo, chúng tôi nghĩ rằng có thể trình duyệt của khách hàng không gửi cookie. Chúng tôi đã bắt đầu ghi nhật ký cookie và nhận thấy rằng trong một số trường hợp, cookie RequestVerificationToken_Lw được gửi, nhưng trong một số trường hợp khác không phải là - mặc dù các cookie khác, như cookie được Google Analytics tạo, được gửi cùng tốt. Nó có thể là một cái gì đó trong trình duyệt là tước một số cookie và để lại những người khác trong?

Có vẻ như là anti-forgery token depends on forms authentication. Đây có phải là trường hợp không? Bất kỳ cách nào để tiếp tục sử dụng AntiForgeryToken khi không sử dụng xác thực biểu mẫu một cách đáng tin cậy. Hãy nhớ rằng phương pháp tôi mô tả ở trên hoạt động trong hơn 90% trường hợp, nhưng chúng tôi không thể xác định lý do tại sao phương thức này không hoạt động đối với một số người.

Suy nghĩ?
Cảm ơn!

+0

Tại sao phải quan tâm đến mã thông báo chống giả mạo nếu bạn không sử dụng bất kỳ xác thực nào? Mục đích của cuộc tấn công CSRF là để kẻ tấn công thực hiện các hành động thay mặt cho một số người dùng được xác thực trên một trang web. Và nếu một trang web không sử dụng CSRF xác thực có vẻ không có mục đích. –

+0

Tôi đang sử dụng xác thực, không phải là hình thức xác thực. – pbz

+0

bạn đang sử dụng loại xác thực nào? –

Trả lời

0

Một số người dùng có gặp phải sự cố này không? Hay chỉ một ít thời gian? Ngoài ra, nó có hoạt động đối với một số phương pháp TẤT CẢ thời gian hoặc không phù hợp với phương pháp hành động giống nhau không? Bạn có bất kỳ cuộc gọi ajax nào không? Việc thực thi mã thông báo chống giả mạo mặc định không xử lý các cuộc gọi AJAX. Nhưng bạn có thể viết một số mã tùy chỉnh để làm cho mã hoạt động

+0

tôi không biết tại sao điều đó xuất hiện như một câu trả lời và không phải là một bình luận –

+0

Cảm ơn bạn đã trả lời! 1) Một số người dùng dường như có nó mọi lúc, nhưng một người dùng mà tôi có thể liên lạc với họ có phần không kỹ thuật nên tôi không thể điều tra quá nhiều. Tôi thấy IP và lỗi của họ trong nhật ký, vì vậy tôi biết nó là hợp pháp. 2) Không có cuộc gọi AJAX trên các trang đó. Tôi nhận thức được những hạn chế đó và tôi đã làm việc xung quanh khi cần thiết. – pbz

0

Bạn có thêm mã thông báo chống giả mạo bên trong biểu mẫu không? Mã thông báo antiforgery được lưu trữ trên máy khách thông qua một phần tử HTML ẩn và không phải là một cookie. Câu hỏi khác sẽ là phiên bản trình duyệt mà họ đang sử dụng? Có thể nâng cấp lên phiên bản mới nhất không?

@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken()... 
+0

Có, tôi bao gồm mã thông báo bên trong biểu mẫu. Tôi không biết họ đang sử dụng phiên bản nào, nhưng họ đang sử dụng Internet Explorer (theo một người mà tôi có thể liên lạc). Điều này đã xảy ra với người khác, nhưng tiếc là tôi đã không đăng nhập phiên bản trình duyệt.Tôi có thể phải quay lại và đăng nhập càng nhiều càng tốt để có được nhiều dữ liệu hơn. Tôi đã hy vọng những người khác đã gặp vấn đề này trước đây. – pbz

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