2013年4月20日

解決MVC 網站出現『__RequestVerificationToken" 不存在』錯誤

當你在開發MVC的網站,送出表單時出現以下錯誤

需要的反仿冒表單欄位 "__RequestVerificationToken" 不存在。

這是MVC網站為了防止Cross-Site Request Forgery (CSRF)的攻擊,出線的防護措施,CSRF可以參考這裡

解決方式:


在Html.Form後面加入HTML.AntiForgeryToken()
<% using(Html.Form("UserProfile", "SubmitUpdate")) { %>
    <%= Html.AntiForgeryToken() %>
    <!-- form 開始-->
<% } %>







@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
   <!----form 的敘述--->

}


另外要注意在Loadbalance的環境也可因為Machine設成Auto導致IIS回傳以下錯誤:


System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not
supplied or was invalid.
---> System.Web.HttpException: Validation of viewstate MAC failed. If this 
application is hosted by a Web Farm or cluster, ensure that <machineKey> 
configuration specifies the same validationKey and validation algorithm. 
AutoGenerate cannot be used in a cluster.




解決之道就是把Web farm裡的Web Server的Machine key都設為一樣


Generate Machine Key Elements for Web Farm

沒有留言:

張貼留言