与其禁用 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);
}
}