【问题标题】:Asp C# counter not workingAsp C# 计数器不工作
【发布时间】:2017-12-03 16:57:56
【问题描述】:

我正在创建一个登录功能,我想在用户在 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 语句有问题吗?

【问题讨论】:

  • 你认为你在请求之间坚持attempt在哪里?

标签: c# asp.net counter


【解决方案1】:

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

您需要保持请求之间的尝试次数,您可以通过以下方式之一做到这一点:

  1. 在会话中存储每个帐户(电子邮件)的尝试次数(错误 想法)
  2. 将尝试次数存储在数据库中(好主意)

如果您选择 2. 您可能还想保存日期时间,以便您可以执行以下操作:“30 分钟后,用户可以重新尝试再次登录”。

【讨论】:

  • 我无法真正编辑数据库以添加尝试部分,因此我必须使用会话。如果我要使用会话,它会是这样的吗?会话[“尝试”] = 尝试;
  • 更像:Session[Email + "#attempts"],以防用户尝试其他帐户(电子邮件)
  • 计数器仍然停留在 5
  • 您必须处理清除,也存储时间,以便检查现在是否是重置它们的好时机(节省的时间 + 30 分钟
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多