即使使用ASP.NET 3.5,我也会收到“验证viewstate MAC failed”错误

时间:2011-04-29 08:42:17

标签: asp.net-3.5

我发现丢失帖子来解决此错误:“验证视图状态MAC失败”。我读到这是一个ASP.NET 2.0错误,这也是一个错误。但我正在使用VS 2008和ASP.NET 3.5 SP1。为什么这个版本会出现这个错误呢?

我正在使用ASP TextBox控件。有些帖子提到ASP TextBox会产生这个错误,所以我将每个TextBox的AutoPostBack设置为False。

如何摆脱这种混乱?

下面添加的代码**

* Default.aspx *

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FlexStock._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <!--<%@ Register Assembly="MSCaptcha" Namespace="MSCaptcha" TagPrefix="cc1" %>-->
    <link rel="Stylesheet" type="text/css" href="~/Styles/main.css" />
    <title>FlexStock@.NET - Gamma Edition</title>
</head>
<body id="LoginPageBody" class="loginPageBodyClass">
<img id="imgProductLogo" src="Styles/stockist_gamma.png" style="text-align:center;text-shadow:black;margin-left:500px" alt="Product Logo"/>
    <form id="loginForm" runat="server" class="loginForm" action="./Forms/selectCompany.aspx" >
    <div id="divMainLoginPage" runat="server">
        <div class="label">
            <asp:Label ID="lblUserName" runat="server" CssClass="LabelControls" AssociatedControlID="txtUserName">User Name: </asp:Label>     
        </div>

        <div class="value">
            <asp:TextBox ID="txtUserName" runat="server" CssClass="TxtStyle" Width="199px" AutoPostBack="false"></asp:TextBox>
        </div>

        <div class="label">
            <asp:Label ID="lblPassword" runat="server" CssClass="LabelControls" AssociatedControlID="txtPassword">Password: </asp:Label>     
        </div>

        <div class="value">
            <asp:TextBox ID="txtPassword" runat="server" CssClass="TxtStyle" TextMode="Password" Width="199px" AutoPostBack="false"></asp:TextBox>        
        </div>

        <div class="label">
            <asp:Label ID="lblCaptcha" runat="server" Text="Security Check"></asp:Label>
        </div>

        <div class="value">
           <!-- <cc1:CaptchaControl ID="ccJoin" runat="server" CaptchaBackgroundNoise="none" CaptchaLength="5" CaptchaHeight="60" CaptchaWidth="200" CaptchaLineNoise="None" CaptchaMinTimeout="5" CaptchaMaxTimeout="240" />  -->
        </div>

        <div class="label">
            <asp:Label ID="lblEnterCaptcha" runat="server" Text="Enter Value"></asp:Label>
        </div>

        <div class="value">
            <asp:TextBox ID="txtCaptcha" runat="server" CssClass="TxtStyle" Width="199px" AutoPostBack="false"></asp:TextBox><br /><br />
            <asp:Button ID="btnLogin" runat="server" Width="60" Text="Login" CssClass="BtnStyle"/>
        </div>
    </div>
    </form>
    <img id="img1" src="Styles/impact_logo.png" style="text-align:right;text-shadow:black;margin-left:800px" />
</body>
</html>

selectCompany.aspx **

<%@ Page Title="" Language="C#" MasterPageFile="~/master1.Master" AutoEventWireup="true" CodeBehind="~/Forms/selectCompany.aspx.cs" Inherits="FlexStock.Forms.selectCompany" EnableViewStateMac="false" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <link rel="Stylesheet" type="text/css" href="../Styles/selectCompany.css" />
    <link rel="Stylesheet" type="text/css" href="../Styles/main.css" /> 

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

   <form id="frmSelectCompany" enableviewstate="false">
        <div id="label" class="label" style="width:300px">
            <asp:Label ID="lblSelectCompany" runat="server" Text="Select Company or Create New"></asp:Label>
        </div>
        <div id="btnCreate" style="text-align:right">
            <asp:Button ID="btnCreateNew" runat="server" Text="Create New" CssClass="BtnStyle" />
        </div><br />

        <div id="divGrid">
        </div>

    </form>

</asp:Content>

1 个答案:

答案 0 :(得分:1)

这是一个非常常见的错误。它是ASP.NET中的一项安全功能,可以防止有人在呈现页面后向页面注入其他控件,并将这些控件发布回服务器。这会让你的网站更难破解。

您是否通过javascript创建任何输入控件?如果是这样,不要。通常在Web表单中创建控件并将其包装在<div style='display:none;'>中,并在需要时显示它们。

您是否在C#中动态创建任何控件? - 如果是,则必须在Page_Init内创建它们,而不是Page_Load,否则ASP.NET不会将它们识别为有效。

您可以通过在aspx页面顶部设置EnableViewStateMac=False来禁用此安全措施,但我强烈反对。