Даже с ASP.NET 3.5, я получаю ошибку «Проверка viewstate MAC не удалась»

#asp.net-3.5

#asp.net-3.5

Вопрос:

Я нашел потерянные сообщения для устранения этой ошибки: «Проверка viewstate MAC не удалась». Я читал, что это ASP.NET ошибка 2.0, которая также является ошибкой. Но я использую VS 2008 с ASP.NET 3.5 SP1. Почему эта ошибка появляется и в этой версии?

Я использую элементы управления текстовым полем ASP. В некоторых сообщениях упоминалось, что текстовые поля ASP генерируют эту ошибку, поэтому я установил для 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>
  

Выберите Company.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:

Это довольно распространенная ошибка, которую можно увидеть. Это функция безопасности в ASP.NET это не позволяет кому-либо вводить дополнительные элементы управления на страницу после ее рендеринга и отправлять эти элементы управления обратно на сервер. Это затрудняет взлом вашего веб-сайта.

Создаете ли вы какие-либо элементы управления вводом с помощью javascript? Если это так, не делайте этого. Создайте элементы управления обычным образом внутри веб-формы и оберните их в <div style='display:none;'> и отобразите их, когда они вам понадобятся.

Вы создаете какие-либо элементы управления динамически в C #? — Если это так, вы должны создать их внутри, Page_Init а не Page_Load в противном случае ASP.NET не распознает их как действительные.

Вы можете отключить эту меру безопасности, установив EnableViewStateMac=False в верхней части страницы aspx, но я настоятельно не советую этого делать.

Комментарии:

1. У меня есть элемент управления Captcha в Default.aspx. Когда я нажимаю кнопку входа в эту форму, она выдает ошибку при открытии другой формы.

2. @RPK Трудно сказать, не видя кода. Если вы создаете тестовую страницу только с капчей и кнопкой, выполняется ли обратная отправка без ошибок?

3. Я полностью отключил Captcha, но все равно получил ошибку. Когда я добавил EnableViewStateMac = False, это сработало. Но вы говорите, что это не рекомендуется. Чем что? Вставляю код в свою операционную систему.

4. @RPK Проблема в том, что вы публикуете в selectCompany.aspx со страницы default.aspx. Обычно ASP.NET страницы должны отправлять сообщения обратно самим себе, что объясняет ошибку. Удалите action из формы. Создайте обработчик кнопки, чтобы перехватить событие btnLogin_Click, поместите здесь свой код проверки входа в систему и выполните ‘Ответ. Перенаправление («SelectCompany.aspx»)», если вход в систему прошел успешно.