修复CSRF时验证viewstate MAC失败错误

时间:2013-12-24 04:25:20

标签: c# asp.net csrf

我修复了跨站点请求伪造(CSRF)。在主页的OnInit方法中:

if (requestCookie != null && Utility.GuidTryParse(requestCookie.Value, out requestCookieGuidValue))
{
    _antiXsrfTokenValue = requestCookie.Value;
    Page.ViewStateUserKey = _antiXsrfTokenValue;
}
Page.PreLoad += master_Page_PreLoad;

在master_Page_PreLoad中我验证

        if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue || (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
        {
            logCSRF.Info("Error CSRF " + CurrentSession.CurrentUser.user_id);
            Response.Redirect(Constants.DefaultPage.LoginPage);
        }

验证后我重置了antiXsrfTokenValue和cookie的值:

 _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
 Response.Cookies[AntiXsrfTokenKey].Value = _antiXsrfTokenValue;

异常thow“ 对viewstate MAC的验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法.AutoGenerate不能在群集中使用。< / EM>

为什么要这样解决?解决?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

请允许我详细说明,

将asp.net Web应用程序部署到具有多个服务器的环境中时,每个服务器machine.config或web.config都必须指定用于加密视图状态的相同密钥。出于安全原因,视图状态已加密,并且每个Web服务器上的每个machine.config将具有不同的密钥,因此它们必须全部相同。最好的方法是将machineKey元素添加到每个Web服务器的web.config中,并定义相同的键和算法。 machineKey位于System.web节点下。

我找到了一些可以解释它的资源,或者对我自己做得更好一些。

Validation of viewstate MAC failed.Application hosted by a Web Farm, ensure configuration

asp.net

答案 1 :(得分:-1)

尝试在web.config文件的部分添加此字符串:

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