登录系统错误,将不允许登录
本文关键字:登录 不允许 系统错误 | 更新日期: 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:
有些观点我不能不指出:
如果文件结构损坏,您会怎么做?
如果用户想使用相同的用户名和密码注册两次怎么办?
请对密码进行编码。这是不道德的。您将在其他地方使用相同帐户信息的成员置于危险之中。
尝试使用比文本文件更强大、更快的数据库。