2009-09-01 61 views
19

Sau khi xuất bản một xây dựng mới của ứng dụng web ASP.NET MVC của tôi, tôi thường thấy ngoại lệ này ném khi duyệt vào trang web:ASP.NET MVC Xác nhận của ViewState MAC thất bại

System.Web.Mvc.HttpAntiForgeryException: 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ệ. ---> System.Web.HttpException: Xác nhận MAC ViewState không thành công. Nếu ứng dụng này được lưu trữ bởi một Web Farm hoặc cluster, hãy đảm bảo rằng cấu hình chỉ định cùng một thuật toán validationKey và validation. AutoGenerate không thể được sử dụng trong một cụm. ---> System.Web.UI.ViewStateException: Chế độ xem không hợp lệ.

Ngoại lệ này sẽ tiếp tục xảy ra trên mỗi trang tôi truy cập trong ứng dụng web của tôi cho đến khi tôi đóng Firefox. Sau khi mở lại Firefox, trang web hoạt động hoàn hảo. Có ai biết cái gì đang xảy ra không?

Ghi chú thêm:

  1. Tôi không sử dụng bất kỳ điều khiển ASP.NET web (không có trường hợp của runat = "server" trong ứng dụng của tôi)
  2. Nếu tôi đưa ra các <% = Html .AntiForgeryToken%> từ các trang của tôi, sự cố này dường như biến mất

Trả lời

32

Dưới trang bìa, thuộc tính MVC AntiForgeryToken sử dụng khóa máy để mã hóa. Nếu bạn không chỉ định một machinekey trong web.config (xem here), một được tự động tạo cho bạn bởi ASP.NET (full description).

Nếu ứng dụng ASP.NET được khởi động lại (ví dụ: iisreset), AntiForgeryToken trong cookie trình duyệt sẽ vẫn được mã hóa bằng khóa máy cũ, do đó nó bị lỗi.

Vì vậy, bạn luôn phải chỉ định một phím máy trong web.config của mình khi sử dụng MVC, ví dụ:

<configuration> 
    <system.web> 
     <machineKey 
      validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"   
      decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F" 
      validation="SHA1" 
      decryption="AES" 
     /> 
    ... 
+0

Tôi vẫn gặp lỗi ngay cả khi tôi nhập machineKey như thế này. Nó có thể là machine.config trên máy chủ (tôi đã không truy cập vào điều này) không được cấu hình chính xác? – jesperlind

+0

@jesperlind: (Một chút trễ, nhưng bất cứ ai đọc điều này có thể được giúp đỡ ...) Bạn vẫn nhận được lỗi vì bạn có một cookie từ trước khi bạn thêm phím máy. Nó sẽ chỉ hoạt động mà không bị cản trở nếu bạn đã khóa máy từ khi bắt đầu. – Guffa

+4

Lưu ý: Không sử dụng khóa máy chính xác từ mã bên trên. Nếu tất cả các trang web có cùng một khóa máy, thật dễ dàng để vượt qua. Sử dụng trình tạo khóa máy trực tuyến để tạo khóa duy nhất, ví dụ http://aspnetresources.com/tools/machineKey – Guffa

1

Nếu bạn ở trên máy chủ, đảm bảo rằng phím máy của bạn trên mọi máy chủ đều giống nhau.

0

Tôi cũng gặp sự cố này và hy vọng người dùng xóa bộ nhớ cache, cookie hoặc làm mới trang của họ không được chấp nhận.

Thêm máy tính vào web.config sẽ sửa lỗi này. Tôi đã sử dụng công cụ này để nhanh chóng tạo ra một khóa vì vậy tôi không thấy các lỗi này trong quá trình phát triển và sau đó tôi tạo một lỗi chính xác khi trang web đi vào sản xuất.

http://aspnetresources.com/tools/machineKey

+1

Liên kết đã lỗi thời. – Matty

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