0

我们在新的 VS 2012 中使用新的 ASP.NET Web 表单模板。因为我们在 IIS 上遇到了一些问题,所以出现了这个错误:

“System.Web.HttpException (0x80004005):viewstate MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。不能在集群中使用 AutoGenerate。--- > System.Web.UI.ViewStateException:无效的视图状态。”

然后我们对 web.config 进行了以下更改:

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

但是,我们得到了错误:“Anti-XSRF 令牌的验证失败。”

然后我们注释了 Site.Master.cs 中关于 Anti-XSRF 令牌验证的所有代码(因为站点用于 Intranet),但是现在我们无法使用 IE 登录(在 Chrome 和 Firefox 中有效),因为登录后(成功in log),它再次重定向到登录页面,但用户已登录。

更新 我尝试了这里的所有解决方案,但它不起作用:http: //blogs.msdn.com/b/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error。 .aspx _ 最后,我还尝试了:在 web.config 中,但随后出现错误:System.InvalidOperationException:Anti-XSRF 令牌验证失败。仍然没有解决方案。

更新 2 是否有适当的方法在新的 ASP.NET Web 表单模板项目中禁用 Anti-XSRF 令牌验证?

4

1 回答 1

2

与其禁用 ASP.NET 的所有安全功能(根本不建议这样做),不如专注于解决实际错误。

System.Web.HttpException (0x80004005): Validation of viewstate MAC failed是一个常见的错误。要解决它,您必须machinekey在 web.config 文件中定义要使用的。这通常是因为您在回发中有两个不同的键。在 web.config 中定义一个很可能会解决问题(不要忘记重新激活安全功能,如视图状态加密)。你可以在这里生成一个:http: //aspnetresources.com/tools/machineKey

有关示例,请参阅此帖子:https ://stackoverflow.com/a/6260201/375304 (但不要使用相同的密钥)。

另外,请查看此链接,了解与机器密钥相关的 ASP.NET 安全功能可能会有所帮助。 http://msdn.microsoft.com/en-us/library/ff649308.aspx

更新:如果其中任何一个不起作用,请尝试以下(来源):

基于上述#3 的另一个解决方案,特别感谢 Alex 在下面的评论中发布此内容。他编写了一个名为 BasePage 的小类来解决这些问题,因此您只需从 BasePage 而不是 Page 扩展您的页面:

public class BasePage : Page
{
  private static string[] aspNetFormElements = new string[] 
  { 
    "__EVENTTARGET",
    "__EVENTARGUMENT",
    "__VIEWSTATE",
    "__EVENTVALIDATION",
    "__VIEWSTATEENCRYPTED",
  };

  protected override void Render(HtmlTextWriter writer)
  {
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
    base.Render(htmlWriter);
    string html = stringWriter.ToString();
    int formStart = html.IndexOf("<form");
    int endForm = -1;
    if (formStart >= 0)
      endForm = html.IndexOf(">", formStart);

    if (endForm >= 0)
    {
      StringBuilder viewStateBuilder = new StringBuilder();
      foreach (string element in aspNetFormElements)
      {
        int startPoint = html.IndexOf("<input type=\"hidden\" name=\"" + element + "\"");
        if (startPoint >= 0 && startPoint > endForm)
        {
          int endPoint = html.IndexOf("/>", startPoint);
          if (endPoint >= 0)
          {
            endPoint += 2;
            string viewStateInput = html.Substring(startPoint, endPoint - startPoint);
            html = html.Remove(startPoint, endPoint - startPoint);
            viewStateBuilder.Append(viewStateInput).Append("\r\n");
          }
        }
      }

      if (viewStateBuilder.Length > 0)
      {
        viewStateBuilder.Insert(0, "\r\n");
        html = html.Insert(endForm + 1, viewStateBuilder.ToString());
      }
    }

    writer.Write(html);
  }
}
于 2013-10-09T07:47:54.187 回答