登录系统错误,将不允许登录

本文关键字:登录 不允许 系统错误 | 更新日期: 2023-09-27 18:33:31

好的,多亏了 LordALMMa,我把它整理好了,但现在我有另一个问题。我想确定用户在注册时是单击管理员还是用户单选按钮。我想我应该把它附加到名称和密码所在的文本文件的行尾,但我该怎么做?以下是相关代码:

单选按钮检查

public bool radioButtons()
    {
        string usertypebutton;
        if (!userButton.Checked && !adminButton.Checked)
        {
            MessageBox.Show("You must select an account type");
            return false;
        }
        else
        {
            if (userButton.Checked)
            {
                usertypebutton = "User";
            }
            else
            {
                usertypebutton = "Admin";
            }
            return true;
        }
    }

用于注册的流编写器:

public void mySW()
    {
        string path = @"C:'Other'myFile.txt";
        string userName = userNameBox.Text;
        string password = passwordBox.Text;
        string usertype = usertypebutton;
        using (StreamWriter writer = new StreamWriter(path, true))
        {
            writer.WriteLine("Username: {0} Password: {1} Type: {3}" , userName, password, usertype);
            // No need to close nor dispose your StreamWriter.
            // You're inside a using statement for that!
        }
        MessageBox.Show("Thanks for registering! 'n'nYou may now log in!", "Registration SuccessFul");
        Application.OpenForms[0].Show();
        this.Close();
    }

登录:

 private void logonButton_Click(object sender, EventArgs e)
    {
        // Loads your users storage
        var users = File.ReadAllLines(@"C:'Other'myFile.txt");
        // Creates the line with username + password
        var usernamePassword = String.Format("Username: {0} Password: {1}", userNameBox.Text, passwordBox.Text);
        // Locates the user on your storage
        var userFound = users.SingleOrDefault(_u => _u.Equals(usernamePassword));
        if (userFound != null)
        {
            MessageBox.Show("Welcome back, " + userNameBox.Text);
        }
        else
        {
            MessageBox.Show("Sorry, you have entered incorrect details'n'nPlease try again");
            userNameBox.Text = "";
            passwordBox.Text = "";
        }
    }

所以(我认为)本质上我想将值用户类型按钮从单选按钮方法传递给软件。我该怎么做,因为我已经在传递一个布尔值?

安东尼

登录系统错误,将不允许登录

问题的一部分是你写的字符串与你正在阅读的字符串不同:

writer.WriteLine("Password: " + userName + " " + "Password: " + password);

我猜那是你帖子中的一个错字......但如果不是,那可能是你的问题。

另一个问题可能就在这里:

using (StreamWriter writer = new StreamWriter(path, true))

如果查找有关 StreamWriter 构造函数重载的文档,则会看到您指定了 append = true 。 您将每组登录凭据附加到其自己行上的文件。 但稍后,您只读取该文件的第一行。 因此,您将始终读取首次创建文件时输入的第一组凭据。

除此之外,我希望您只是将其作为实验,因为这不是管理密码以将其写入此类文件的安全方法。 此外,如果您将流包装在using块中,则无需在流上调用关闭和处置,因此您应该坚持这样做。

Anthony,尽管以这种方式存储登录是一个主要的安全问题(它甚至不再是一个风险),但我会对您的代码进行一些更改。

问题是您没有存储"用户名:[用户名] 密码:[密码]"。如果您仔细检查保存方法,则会存储"密码:[用户名] 密码:[密码]"。这就是为什么他们从未被发现的原因。

以下是一些更改:

考虑:

public void mySW()
{
    string path = @"C:'Other'myFile.txt";
    string userName = userNameBox.Text;
    string password = passwordBox.Text;
    using (StreamWriter writer = new StreamWriter(path, true))
    {
        // This overload makes your life easier by auto-formatting variables for you.
        // Also, avoid the "string1 + string2" concatenation mode.
        // Use String.Format instead. It's easier to read and keep over time.
        writer.WriteLine("Username: {0} Password: {1}", userName, password);
        // No need to close nor dispose your StreamWriter.
        // You're inside a using statement for that!
    }
    MessageBox.Show("Thanks for registering! 'n'nYou may now log in!", "Registration SuccessFul");
    Application.OpenForms[0].Show();
    this.Close();
}

您的其他方法应如下所示:

{
    // Loads your users storage
    var users = File.ReadAllLines(@"C:'Other'myFile.txt");
    // Creates the line with username + password
    var usernamePassword = String.Format("Username: {0} Password: {1}", userNameBox.Text, passwordBox.Text);
    // Locates the user on your storage
    // This uses Linq syntax with lambda. Linq without lamba looks similar to SQL.
    // Lambda is a bit more advanced but reduces code-size and it's easier to understand (IMHO).
    // This code will iterate through users (list of string) and try to retrieve one that's equal to the contents of usernamePassword.
    var userFound = users.SingleOrDefault(_u => _u.Equals(usernamePassword));
    // If null, indicates that no username/password combination was found.
    if (userFound != null)
    {
        MessageBox.Show("Welcome back, " + userNameBox.Text);
    }
    else
    {
        MessageBox.Show("Sorry, you have entered incorrect details'n'nPlease try again");
        userNameBox.Text = "";
        passwordBox.Text = "";
    }
}

我没有检查异常。如果找到 2 条或更多记录来计算搜索模式,则 SingleOrDefault 将引发异常。

我没有检查这一点,因为这会增加 try-catch 的复杂性,也因为要使其正常工作,我必须在录制之前检查它们是否退出,因此更改注册方法。

但我想你已经有了这个想法。

你检查过你的输出文件吗?您正在写入 密码: X 密码: Y:

writer.WriteLine("Password: " + userName + " " + "Password: " + password);

并且您正在检查用户名:X 密码:Y

if (user == ("Username: "+userNameBox.Text.Trim()+" "+"Password: "+passwordBox.Text.Trim()))

您正在添加行作为

writer.WriteLine("Password: " + userName + " " + "Password: " + password);
                  ^1                              ^2

^1必须Username:

有些观点我不能不指出:

  1. 如果文件结构损坏,您会怎么做?

  2. 如果用户想使用相同的用户名和密码注册两次怎么办?

  3. 请对密码进行编码。这是不道德的。您将在其他地方使用相同帐户信息的成员置于危险之中。

  4. 尝试使用比文本文件更强大、更快的数据库。