我们在新的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);
}
}