2011-12-21 42 views
9

Im sử dụng MVC 3 và mọi thứ được thiết lập chính xác từ những gì tôi có thể nhìn thấy.Mã thông báo chống giả mạo bắt buộc không được cung cấp hoặc không hợp lệ

Một người dùng Xác thực gửi biểu mẫu bằng Mã thông báo chống xâm phạm và mọi thứ đều hoạt động tốt.

Đó là trừ khi người dùng đã để lại biểu mẫu được gửi mở và trong thời gian đó đăng nhập người dùng đã hết hạn.

Khi người dùng gửi biểu mẫu khi họ không còn được xác thực, họ nên được đưa trở lại trang đăng nhập. (điều này xảy ra một số lần)

Thay vì ngoại lệ 'Mã thông báo chống giả mạo bắt buộc không được cung cấp hoặc không hợp lệ.' được ném. Tôi tưởng tượng nó bị ném vì mã thông báo được mã hóa chứa một số chi tiết người dùng không thể xác minh được vì người dùng không còn được xác thực nữa.

Trường hợp ngoại lệ là chính xác nhưng không bao giờ bị ném khi trang trở lại màn hình Đăng nhập vì vấn đề thực sự là người dùng rời khỏi biểu mẫu đang mở và đăng nhập của mình đã hết thời gian chờ.

Sự cố này khó tái tạo vì không phải lúc nào cũng làm được.

Tôi thấy rất nhiều người dường như gặp sự cố này nhưng không có giải pháp nào sắp diễn ra.

Đây có phải là vấn đề trong chính MVC không?

Cài đặt và công cụ khóa máy đều chính xác để không phải là vấn đề.

+0

Công cụ chống giả mạo thực sự xảy ra trong 'System.Web.WebPages', chứ không phải MVC. Vì vậy, bạn sẽ muốn tìm trong nguồn đó, chứ không phải là MVC. –

+0

Tôi không chắc chắn rằng AntiForgeryToken có liên quan gì đến người dùng, vì nó có thể được sử dụng không phụ thuộc vào sự cho phép. Nó có thể là thời gian liên quan. – stevethethread

Trả lời

2

tôi thêm một câu trả lời tốt hơn ở đây vì đây là một nỗi đau như thế và kém trả lời qua tất cả các web Tôi nghĩ tôi sẽ thêm các giải pháp hiện đang làm việc của tôi.

Về cơ bản (bỏ qua các tùy chọn khác nhau) AntiForgeryToken hoạt động bằng cách thêm cookie phiên sau đó được đọc khi biểu mẫu được đăng bằng cách trang trí bộ điều khiển với thuộc tính [ValidateAntiForgeryToken].

Trước hết, trước khi chúng tôi sửa bất kỳ thứ gì làm nguyên tắc chung, hãy luôn làm như sau.

  1. Trong web.config hãy tạo một máyNhập như sau.

    <machineKey validationKey="YOUR_KEY" decryptionKey="YOUR_KEY" validation="SHA1" decryption="AES" />

    ** Lưu ý SHA1 này Thats là không thực sự rất an toàn nữa nhưng một cuộc thảo luận **

    Google <machineKey> Generator và cấu hình.

    http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.100%29.aspx

  2. Thay đổi tên cookie mặc định từ '__RequestVerificationToken' để một trong đó sẽ không được sử dụng bởi ứng dụng khác. (Tôi luôn sử dụng GUID).

    Làm điều này với AntiForgeryConfig.CookieName = "YOUR_NAME";

  3. Tạo một thuộc tính tùy chỉnh mới.

Lý do lỗi này dường như xuất hiện mà không có lý do là cookie chỉ có giá trị đối với cuộc đời của một phiên làm việc. Vì nhiều lý do khác nhau nhưng chủ yếu là thực tế là mọi người rời khỏi các trang mở một thời gian rất rất dài trong phiên. Vì phiên đã hết thời gian nên cookie không còn hiệu lực nữa.

Một vấn đề khác là nếu bạn có thuộc tính [Ủy quyền] trên bài đăng cho bộ điều khiển, luồng mọi thứ sẽ kích hoạt HttpAntiForgeryException trước khi nó kiểm tra xem ai được xác thực. (trong hầu hết xác thực dựa trên cookie khi phiên đã hết hạn, người dùng không được xác thực nữa)

Cách để giải quyết vấn đề này là tạo thuộc tính [CustomValidateAntiForgeryToken] tùy chỉnh.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
    public class CustomValidateAntiForgeryToken : FilterAttribute, IAuthorizationFilter { 

    public void OnAuthorization(AuthorizationContext filterContext) { 

     if (filterContext == null) { 
     throw new ArgumentNullException("filterContext"); 
     } 

     try { 
     AntiForgery.Validate(); 
     } 
     catch { 

     // Here do whatever is you wish 
     // you could just re throw the error or what ever. 

     // In this case I have redirected to a Signout 

     filterContext.Result = new RedirectToRouteResult( 
      new RouteValueDictionary( 
      new { 
       action  = "Sign_Out", 
       controller = "SOME_CONTROLLER", 
       area  = "" 
      } 
     ) 
     ); 

     } 

    } 

    } 

Và cuối cùng nếu bạn thay đổi bất kỳ điều này trong bất kỳ hệ thống hiện sống chắc chắn rằng tất cả mọi người đăng xuất, tắt trình duyệt của họ thậm chí khởi động lại nếu có thể và xóa cookie và bộ nhớ đệm của họ. Bạn vẫn có thể gặp lỗi cho đến khi bạn đã thực hiện việc này cho mọi người dùng ngay cả sau khi thay đổi mã.

Rõ ràng mọi người có nhu cầu khá khác nhau nhưng hy vọng điều này cung cấp đủ tư vấn để kiểm soát vấn đề này rất phổ biến và gây phiền nhiễu.

Nếu có ai thấy bất kỳ thứ gì sẽ giúp hoặc có thể được thêm, vui lòng thực hiện.

1

Trên hành động của bạn, hãy đặt thuộc tính [Authorize] phía trên thuộc tính [ValidateAntiForgeryToken]. Chúng thực hiện theo thứ tự từ trên xuống dưới. Vì vậy, nó nên nhấn ủy quyền và thấy bạn không còn được xác thực.

+0

Thuộc tính không được bảo đảm để được truy lục theo thứ tự bạn đã viết, đúng không? –

+0

Ryand.Johnson đã là trường hợp mặc dù điều đó không thực sự gây ra vấn đề –

5

Lý do cho điều này có vẻ là ở một số tổ chức lớn, mọi người để máy của họ bật mà không cần khởi động lại và trình duyệt mở mà không phải tắt chúng trong một thời gian rất dài. Đôi khi thậm chí hàng tuần khi kết thúc.

Nếu phím Máy đã được thêm vào sau hoặc thay đổi, các máy chưa được tắt hoặc tắt trình duyệt là những máy gây ra lỗi này. Một khi mọi máy đã được khởi động lại hoặc trình duyệt tắt thì lỗi sẽ dừng lại.

Lưu ý: Để dừng lỗi này, điều quan trọng là tạo khóa máy.

Google: Máy phát điện chính

+4

Tôi không biết tại sao điều này đã bị bỏ phiếu. Đây chính xác là những gì đã gây ra vấn đề cho chúng tôi và một khi một khóa máy đã được thêm vào và tất cả các máy đã được khởi động lại vấn đề không còn xảy ra nữa. –

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