چگونگی بررسی خطای ASP.NET Viewstate's MAC - Machine Key

 MAC مخفف Message Authentication Code سیستمی برای تصدیق عدم دستکاری شدن دیتای در حال تبادل بین وب سرور و سیستم کاربر می باشد.

Viewstate نیز راهکار ASP.NET برای نگه داشتن دیتای فرم ها در postback ها می باشد.

دیتای فرم ASP.NET ، به شکل کدگذاری شده ی )base-64 base64 تکنولوژی کدگذاری می باشد) در داخل مقداری(value ای) پنهان شده در داخل فرم ASP.NET، با نام _Viewstate قرار داده/ذخیره می شود.

MAC جهت جلوگیری از تغییر و دستکاری(توسط هکر) در دیتای VIEWSTATE طراحی شده است.

ASP.NET با بررسی دیتای موجود در viewstate و استفاده از کلید تایید اعتبار پنهانی(Secret Validation Key)  یک hash از آن دیتا با استفاده از الگوریتم SHA-1 می سازد. مقدار آن hash همان MAC می باشد و ASP.NET آن را در داخل فرم ارسالی به کاربر قرار می دهد.

وقتی postback رخ می دهد مرورگر شما دیتای فرم،viewstat  و MAC value را به وب سرور ارسال می کند. ASP.NET با بررسی دیتای viewstate ارسال شده، و سپس مقایسه آن MAC value با MAC value موجود در محتوای POST (درخواستی که از سمت مرورگر کاربر به وب سرور جهت دریافت صفحات ارسال می شود) مقایسه می کند. اگر هر دو MAC value یکسان باشند در نتیجه ASP.NET متوجه می شود کسی viewstate را دستکاری نکرده است. و در غیر اینصورت ASP.NET خواهد پنداشت که کسی دیتای viewstate را دستکاری کرده است و در نتیجه پیغام خطای invalid_viewstate را بازخواهد گرداند.

در چه شرایطی ممکن است MAC value متفاوت از آن چیزی باشد که  سرور انتظار آن را دارد؟

دلایل متعددی ممکن است باعث عدم تطابق MAC value با آن چه ASP.NET انتظار دارد شود.

·         اقدام هکری برای تغییر دیتای viewstate

·         دیتای فرم در هنگام ارسال به سرور قطع شده باشد(به علت timeout، porxy server و ...)

·         ارجاع فرم به یک وب سرور دیگر( در صورت ست نبودن machinekey یکسان در هر دو سرور mac value های ایجاد شده توسط هر سرور متفاوت خواهد بود) 

·         متفاوت بودن validation key  استفاده شده برای ساختن mac قبلی با validation key ای که برای ساختن MAC جدید استفاده می شود.


راهکار :
اگر در سایت خود از Auto-generate key  استفاده می کنید (معمولا بصورت پیش فرض فعال است)، برای رفع مشکل می توانید یک کلید ثابت تعریف کنید.برای تعریف static machine key  می توانید از این سایت استفاده کنید. کلید تعریف شده را  در فایل web.config  در میان بخش زیر قرار دهید.
<system.web>
.
<system.web/>