【问题标题】:Validation of viewstate MAC failed error when fix CSRF修复 CSRF 时验证视图状态 MAC 失败错误
【发布时间】:2013-12-24 04:25:20
【问题描述】:

我修复了跨站点请求伪造 (CSRF)。在 masterpage 的 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;

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

为什么会有这个扩展?解决?

谢谢你的帮助!

【问题讨论】:

  • 验证成功后为什么要重置token?令牌旨在长期存在。
  • 我想更改每个操作的令牌值。
  • 但是为什么呢?你到底想解决什么问题?正如我之前提到的 - 这些令牌旨在长期存在,因此这可能不是实现您预期目标的最佳方式。如果您告诉我们您的总体情况是什么,我们或许可以提出更合适的行动方案。

标签: c# asp.net csrf


【解决方案1】:

请允许我详细说明,

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

我找到了一些资源可以解释它或比我自己更好地回答它。

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

asp.net

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 似乎把问题扫到了地毯下。
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-12-18
    相关资源
    最近更新 更多