在 Web 窗体中禁用反 XSRF 令牌验证 ASP.NET 将重定向到 IIS 和 IE 上的登录页



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

"System.Web.HttpException (0x80004005(:视图状态 MAC 验证失败。如果此应用程序由 Web 场或群集承载,请确保配置指定相同的验证密钥和验证算法。自动生成不能在群集中使用。---> System.Web.UI.ViewStateException:视图状态无效。

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

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

但是,后来我们收到错误:"反XSRF令牌验证失败。

然后,我们在Site.Master.cs中注释了所有代码,关于反XSRF令牌验证(因为站点在Intranet上使用(,但是现在我们不能使用IE登录(在Chrome和Firefox中工作(,因为登录后(在日志中成功(,它会再次重定向到登录页面,但用户已登录。

更新我从这里尝试了所有解决方案,但它不起作用: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 窗体模板项目中禁用反 XSRF 令牌验证?

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

System.Web.HttpException (0x80004005): Validation of viewstate MAC failed是一个常见错误。要解决这个问题,您必须定义要在 web.config 文件中使用的machinekey。这通常是因为您在回发中有两个不同的密钥。在 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的小类。 这样可以解决问题,因此您只需要将页面从 基本页面而不是页面:

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("rn");
          }
        }
      }
      if (viewStateBuilder.Length > 0)
      {
        viewStateBuilder.Insert(0, "rn");
        html = html.Insert(endForm + 1, viewStateBuilder.ToString());
      }
    }
    writer.Write(html);
  }
}

最新更新