Sửa lỗi “Validation of viewstate MAC failed”

Sửa lỗi “Validation of viewstate MAC failed”

Khi ta chạy website viết bằng ASP.NET trên web-hosting (đang rất phổ biến ở Việt Nam) mà có nhiều website cùng chạy, mỗi khi ta cập nhật thư viện, assembly, mã nguồn mới (các file cs), khi đó nếu người dùng submit lên từ một trang được sinh ra từ code cũ có thể sẽ gặp phải lỗi “Validation of viewstate MAC failed”. Trong bài viết này tôi sẽ hướng dẫn cách khắc phục triệt để lỗi trên.

Cách giải quyết thường gặp

Nếu tìm kiếm với google để giải quyết lỗi trên, các bạn có thể tìm được cách giải quyết khá nhanh gọn như sau:
Thêm đoạn cấu hình sau vào trong thẻ trong file web.config

<pages enableEventValidation="false" viewStateEncryptionMode="Never">

hoặc áp dụng:

<pages enableViewStateMac="false">

Tuy nhiên, với việc disable các tính năng trên, ta cũng sẽ mất một số tính năng phòng vệ trước kỹ thuật tấn công Cross-site Request Forgery mà framework đã hỗ trợ sẵn.

Sinh machineKey cho site

Để tránh gặp phải lỗi “Validation of viewstate MAC failed”, ta cung cấp các key cho việc validate viewState thay vì để cho IIS tự sinh (AutoGenerate) bằng cách cấu hình thẻ machineKey trong system.web ở file web.config.

<machineKey
validationKey=”AutoGenerate,IsolateApps” [String]
decryptionKey=”AutoGenerate,IsolateApps” [String]
validation=”HMACSHA256″ [SHA1 | MD5 | 3DES | AES | HMACSHA256 |
HMACSHA384 | HMACSHA512 | alg:algorithm_name]
decryption=”Auto” [Auto | DES | 3DES | AES | alg:algorithm_name]
/>

Trong đó:
decryption: nhận một trong các thuật toán sau: Auto | DES | 3DES | AES | alg:algorithm_name
validation: nhận một trong các hàm băm, mã hóa sau: SHA1 | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512
decryptionKey: 64 bit nếu decryption là DES; 192bit nếu là 3DES; 128, 192 hoặc 256 bit nếu là AES
validationKey: 128 bit nếu validation là MD5; 160 bit nếu là SHA1; 192 bit nếu là DES; 256 nếu là AES hoặc HMACSHA256; 384bit nếu là HMACSHA384; 512bit nếu là HMACSHA512

Ví dụ như:

<machineKey validationKey="92ADEE24D070CD4CFF9D0201DC38605F7AAF4B72D185330550DB8D23D053DD1 B1D73DC5E03C14A58B7F9A412961639CE7DA91C80407FE9908A1C4520CB406362" decryptionKey="5524AE3D6EFF3E9A4247A4ADCBE93E7CBAD247EC1C27E2F4666B496BDF5361BC" validation="HMACSHA512" decryption="AES" />

Xem thêm cách thông tin machineKey tại MSDN: machineKey Element

Để sinh machineKey bạn có thể sử dụng Tool sinh machineKey online

Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!