Asp C#计数器无法正常工作

时间:2017-12-03 16:57:57

标签: c# asp.net counter

我正在创建一个登录功能,当用户在3次尝试后输入错误信息时,我想要包含一个锁定,它将它们带到一个空白面板并取消登录部分。我正在使用柜台,但它似乎不起作用。如果我输入错误信息,它会告诉我输入了错误的信息,但我不会被锁定

<asp:Panel ID="panel2" runat="server" Wrap="true" Visible="false">
        <h2 id="logError" runat="server" visible="false">Error logging in</h2>
        <strong>Username</strong><asp:TextBox runat="server" ID="loginName"></asp:TextBox><br />
        <strong>Password</strong><asp:TextBox runat="server" TextMode="Password" ID="loginPass"></asp:TextBox> <br />
        <asp:Button runat="server" Text="Return" OnClick="ReturnMain" />
        <asp:Button runat="server" Text="Log in" OnClick="login" /><br />
        <asp:Label ID="lblInfo2" runat="server"></asp:Label>
    </asp:Panel>

public void login(Object src, EventArgs e)
    {
        get_connection();
        try
        {
            connection.Open();
            command = new SqlCommand("SELECT * FROM subscribers WHERE Email =@Email and Password = @Password", connection);
            command.Parameters.AddWithValue("@Email", loginName.Text);
            command.Parameters.AddWithValue("@Password", loginPass.Text);
            //Session["User"] = loginName.Text;
            //Session["Number"] = attempt;
            int attempt = 0;


            reader = command.ExecuteReader();

            if (reader.HasRows)
            {
                //notification that the user has logged in
                YouHaveLoggedIn.Visible = true;
                panel1.Visible = false;
                panel2.Visible = false;
                panel6.Visible = true;
                WishPanel.Visible = true;
            }
            else
            {
                attempt++;
                lblInfo2.Text = "Attempt count: " + attempt;

                logError.Visible = true;
                if (attempt >= 3) // lockout function but does not work, unsure why
                {
                    lockedOut.Visible = true;
                    panel2.Visible = false;
                }
            }

            reader.Close();
        }
        catch (Exception err)
        {
            //user did not log in successfully
            lblInfo2.Text = "Error reading the database. ";
            lblInfo2.Text += err.Message;
        }
        finally
        {
            //lblInfo.Text = "good connect. ";
            connection.Close();
        }

    }

我有lblInfo2向我显示尝试号码,但它总是保持在1.这是否是我的if else语句的问题?

2 个答案:

答案 0 :(得分:0)

您的attempt变量是login方法中的局部变量,这意味着每次尝试登录时,实际尝试次数始终为0,因此用户获得的最大尝试次数为1

您需要保持请求之间的尝试次数,并且可以使用以下方法之一来执行此操作:

  1. 在会话中存储每个帐户(电子邮件)的尝试次数(错误 想法)
  2. 存储数据库中的尝试次数(好主意)
  3. 如果您选择2.您可能还想保存日期时间,以便您可以执行以下操作:“30分钟后,用户可以重新尝试重新登录”。

答案 1 :(得分:0)

你不能在订阅者表中创建一个新列,它将保存用户登录失败的次数吗? 将计数器置于会话中的想法很糟糕,因为用户可以尝试登录失败并关闭浏览器并使用新会话再次登录。因此每次计数器都会在每次新会话时重置。 你需要在某处存储失败登录的计数器(请不要参加会议)。 另一个不好的方法是将此计数器存储在文本文件中。 为服务器上的每个用户创建一个文本文件,并将失败登录的计数器放入此文本文件中,并在每次尝试失败时更新它。