2013-07-23 32 views
11

Tôi hiện đang làm việc trên một dự án ASP.NET MVC và xuất hiện một lỗi có vẻ kỳ lạ.ASP.NET MVC AntiForgeryToken và Caching

Trong mẫu ASP.NET MVC Templates luôn nhận được một AntiForgeryToken (do đó dẫn tôi tin rằng đây là phương pháp hay nhất). Tuy nhiên AntiForgeryTokens dường như không hoạt động tốt với bộ nhớ đệm.

Ví dụ khi tôi mở trang web có biểu mẫu bao gồm cả AntiForgeryToken và tôi sao chép cửa sổ trình duyệt, cả hai cửa sổ đều có cùng một chính sách AntiForgeryToken dẫn đến ngoại lệ khi đăng biểu mẫu. Vấn đề này không tồn tại khi bộ nhớ đệm bị tắt (thông qua ActionFilter NoCache, xem Disable browser cache for entire ASP.NET website).

Vì vậy, tôi đoán câu hỏi của tôi là: Đây có phải là cách đó không? Có cách nào khác ngoài việc tắt bộ nhớ cache để khắc phục sự cố không?

Đặc biệt thực tế là các mẫu ASP.NET MVC mặc định chứa AntiForgeryTokens nhưng không tắt bộ nhớ cache (và do đó mở cho lỗi được mô tả ở trên) khiến tôi tự hỏi.

Cảm ơn trước!

+0

Bạn có thể đăng mã và lỗi chính xác của mình không? 'Html.AntiforgeryToken()' tạo một mã thông báo mới mỗi lần, vì vậy trong hai cửa sổ trình duyệt, bạn nên có các giá trị khác nhau – andreister

+1

Không nếu trình duyệt không truy vấn máy chủ cho cửa sổ trình duyệt thứ hai nhưng sử dụng bộ nhớ cache của nó. – chrischu

Trả lời

7

Đây là hành vi mong đợi. Caching lưu trữ độc đáo câu trả lời, bao gồm cả giá trị của AntiForgeryToken. Tắt bộ nhớ đệm trên biểu mẫu và đặc biệt trên các trang sử dụng AntiForgeryToken. Nếu bạn nghĩ về điều này hơn nữa, nếu bạn đang ở trong một ứng dụng nhập dữ liệu, bạn có muốn lưu các biểu mẫu nhập dữ liệu của mình không? Chắc là không. Tuy nhiên, bạn muốn lưu trữ các báo cáo nặng - ngay cả khi nó chỉ là bộ nhớ đệm vi mô - một hoặc hai giây.

+1

Ý của bạn là "Tắt bộ nhớ đệm trên biểu mẫu" là gì? –

+0

Bất cứ lúc nào bạn chấp nhận đầu vào của người dùng. Về cơ bản, bất kỳ lúc nào bạn có thẻ '

' hoặc thẻ ''. – robrich