【问题标题】:Even with ASP.NET 3.5, I am getting "Validation of viewstate MAC failed" error即使使用 ASP.NET 3.5,我也会收到“视图状态 MAC 验证失败”错误
【发布时间】:2011-04-29 08:42:17
【问题描述】:

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

我正在使用 ASP TextBox 控件。有些帖子提到 ASP TextBoxes 会产生这个错误,所以我将每个 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>

【问题讨论】:

    标签: asp.net-3.5


    【解决方案1】:

    这是一个很常见的错误。这是 ASP.NET 中的一项安全功能,可防止有人在页面呈现后将其他控件注入页面,并将这些控件发布回服务器。它使您的网站更难被黑客入侵。

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

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

    您可以通过在 aspx 页面顶部设置 EnableViewStateMac=False 来禁用此安全措施,但我强烈建议不要这样做。

    【讨论】:

    • 我在 Default.aspx 上有一个验证码控件。当我按下此表单上的登录按钮时,打开另一个表单时出错。
    • @RPK 很难在没有看到代码的情况下判断。如果你创建一个只有 Captcha 和 Button 的测试页面,它是否回传没有错误?
    • 我完全禁用了验证码,但仍然出现错误。当我添加 EnableViewStateMac = False 时,它​​起作用了。但是你说不推荐。那又如何?在我的 OP 中粘贴代码。
    • @RPK 问题是您从 default.aspx 页面发布到 selectCompany.aspx。通常 ASP.NET 页面应该回发给它们自己,这解释了错误。从表单中删除 action。创建一个按钮处理程序来捕获 btnLogin_Click 事件,将您的登录验证代码放在这里,如果登录成功,则执行 'Response.Redirect("SelectCompany.aspx")`。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多