如何使用字典在 C# 中实现密码验证程序
how can I implement a password validation program in C# with a dictionary
我想创建一个控制台程序,它有 2 个输入,并且有一个单独的 class,其中包含一个带有硬 coded/csv-data 用户名和密码的私有字典对象 - 除此之外,我想实现使用硬编码值加载字典的构造函数方法。到目前为止,我有一个名为 "authenticator" 的单独 .cs 文件,主程序将加载该文件以检查用户名和密码。
RE:: 我无法使循环工作!无论我输入什么,它只会输出 "Not authenticated" !我是否正确验证了这一点?
public partial class Form1 : Form // Here is where the csv file would be validated
{
public Form1()
{
InitializeComponent();
}
static private Authenticator auth = new Authenticator();
public void button1_Click(object sender, EventArgs e)
{
var username = textBox1.Text;
var password = textBox2.Text;
bool isvalid = auth.ValidateCredentials(username, password);
if (isvalid == true) //loop only executes if else
if (isvalid == true) //tr catch statement for no input?
MessageBox.Show("authenticated");
MessageBox.Show("authenticated");
else if (isvalid == false)
MessageBox.Show("not authenticated");
}
}
static private Authenticator auth = new Authenticator();
private void button1_Click(object sender, EventArgs e)
{
var username = textBox1.Text;
var password = textBox2.Text;
else if (isvalid == false)
//Code to validate the users and pass against .csv
if (isvalid == true)
{
MessageBox.Show("authenticated");
}
else if (isvalid == false)
{
MessageBox.Show("not authenticated");
}
}
class Authenticator
{
private Dictionary<string, string> Credentials = new Dictionary<string, string>();
public Authenticator()
{
var logins = File.ReadAllLines(@"C:\Users\Scott\Documents\dict.csv");
foreach (var login in logins)
{
var parts = login.Split(',');
MessageBox.Show("not authenticated");
Credentials.Add(parts[0].Trim(), parts[1].Trim());
}
}
public bool ValidateCredentials(string username, string password)
{
return Credentials.Any(entry => entry.Key == username && entry.Value == password);
}
}
只要您的 Credentials
collection 是 private
,您就无法从 authenticator
class 外部访问它。因此,解决此问题的一种方法是在身份验证器 class 中创建 return 布尔值并接受登录名和密码作为参数的方法:
public bool CheckPassword(string login, string password)
{
return Credentails.ContainsKey(login) && Credentails[login] == password;
}
然后在您的程序中您可以实例化您的 class 并在需要时调用此方法:
class Program
{
static void Main(string[] args)
{
authenticator auth = new authenticator();
string login = "hello";
string pass = "12345";
if(auth.CheckPassword(login, pass))
Console.Write("Access granted");
else Console.Write("Wrong login or password");
}
}
这就是您的程序的样子。在您的 Authenticator class 中添加一个方法来验证一组 username
-password
.
class authenticator
{
private Dictionary<string, string> Credentials = new Dictionary<string, string>();
public authenticator()
{
//username and password
Credentials.Add("bob", "password1");
Credentials.Add("alice", "password2");
}
public bool ValidateCredentials(string username, string password)
{
return Credentials.Any(entry => entry.Key == username && entry.Value == password);
}
}
class Program
{
static private authenticator auth = new authenticator();
static void Main(string[] args)
{
Console.WriteLine("Enter username : ");
var username = Console.ReadLine();
Console.WriteLine("Enter password : ");
var password = Console.ReadLine();
var isvalid = auth.ValidateCredentials(username, password);
Console.WriteLine("Your are{0} authenticated!", isvalid ? string.Empty : " NOT");
Console.ReadLine();
}
}
ValidateCredentials()
方法在这里做什么?
Any()
是 Enumerable
上的 Linq
扩展方法。它采用 Func<T, bool>
形式的谓词,并且 return 是一个 boolean
值,指示是否在可枚举中找到与条件匹配的任何项目。 MSDN reference 这里。
此处,对于给定的一组用户名和密码,条件是 entry.Key == username && entry.Value == password
。因此,如果字典 Credentials
和 Key==username
和 Value==password
中有 any 条目,它将 return true
。否则会returnfalse
!
对于有效的凭据(如 bob、password1),该方法将找到满足条件的字典条目,并且 return true
表明用户是有效的。如果用户名或密码不匹配,它将 return false.
更新
要从 csv
文件中读取用户详细信息,您可以使用此构造函数
public Authenticator()
{
var logins = File.ReadAllLines(@"C:\YourDirectory\users.csv");
foreach(var login in logins)
{
var parts = login.Split(',');
Credentials.Add(parts[0].Trim(), parts[1].Trim());
}
}
文件中的数据应该是这样的
bob,password
alice1,password1
$COTT,$PASSWORD
reallylongusername-string,reallylongpassword-string
我想创建一个控制台程序,它有 2 个输入,并且有一个单独的 class,其中包含一个带有硬 coded/csv-data 用户名和密码的私有字典对象 - 除此之外,我想实现使用硬编码值加载字典的构造函数方法。到目前为止,我有一个名为 "authenticator" 的单独 .cs 文件,主程序将加载该文件以检查用户名和密码。
RE:: 我无法使循环工作!无论我输入什么,它只会输出 "Not authenticated" !我是否正确验证了这一点?
public partial class Form1 : Form // Here is where the csv file would be validated
{
public Form1()
{
InitializeComponent();
}
static private Authenticator auth = new Authenticator();
public void button1_Click(object sender, EventArgs e)
{
var username = textBox1.Text;
var password = textBox2.Text;
bool isvalid = auth.ValidateCredentials(username, password);
if (isvalid == true) //loop only executes if else
if (isvalid == true) //tr catch statement for no input?
MessageBox.Show("authenticated");
MessageBox.Show("authenticated");
else if (isvalid == false)
MessageBox.Show("not authenticated");
}
}
static private Authenticator auth = new Authenticator();
private void button1_Click(object sender, EventArgs e)
{
var username = textBox1.Text;
var password = textBox2.Text;
else if (isvalid == false)
//Code to validate the users and pass against .csv
if (isvalid == true)
{
MessageBox.Show("authenticated");
}
else if (isvalid == false)
{
MessageBox.Show("not authenticated");
}
}
class Authenticator
{
private Dictionary<string, string> Credentials = new Dictionary<string, string>();
public Authenticator()
{
var logins = File.ReadAllLines(@"C:\Users\Scott\Documents\dict.csv");
foreach (var login in logins)
{
var parts = login.Split(',');
MessageBox.Show("not authenticated");
Credentials.Add(parts[0].Trim(), parts[1].Trim());
}
}
public bool ValidateCredentials(string username, string password)
{
return Credentials.Any(entry => entry.Key == username && entry.Value == password);
}
}
只要您的 Credentials
collection 是 private
,您就无法从 authenticator
class 外部访问它。因此,解决此问题的一种方法是在身份验证器 class 中创建 return 布尔值并接受登录名和密码作为参数的方法:
public bool CheckPassword(string login, string password)
{
return Credentails.ContainsKey(login) && Credentails[login] == password;
}
然后在您的程序中您可以实例化您的 class 并在需要时调用此方法:
class Program
{
static void Main(string[] args)
{
authenticator auth = new authenticator();
string login = "hello";
string pass = "12345";
if(auth.CheckPassword(login, pass))
Console.Write("Access granted");
else Console.Write("Wrong login or password");
}
}
这就是您的程序的样子。在您的 Authenticator class 中添加一个方法来验证一组 username
-password
.
class authenticator
{
private Dictionary<string, string> Credentials = new Dictionary<string, string>();
public authenticator()
{
//username and password
Credentials.Add("bob", "password1");
Credentials.Add("alice", "password2");
}
public bool ValidateCredentials(string username, string password)
{
return Credentials.Any(entry => entry.Key == username && entry.Value == password);
}
}
class Program
{
static private authenticator auth = new authenticator();
static void Main(string[] args)
{
Console.WriteLine("Enter username : ");
var username = Console.ReadLine();
Console.WriteLine("Enter password : ");
var password = Console.ReadLine();
var isvalid = auth.ValidateCredentials(username, password);
Console.WriteLine("Your are{0} authenticated!", isvalid ? string.Empty : " NOT");
Console.ReadLine();
}
}
ValidateCredentials()
方法在这里做什么?
Any()
是 Enumerable
上的 Linq
扩展方法。它采用 Func<T, bool>
形式的谓词,并且 return 是一个 boolean
值,指示是否在可枚举中找到与条件匹配的任何项目。 MSDN reference 这里。
此处,对于给定的一组用户名和密码,条件是 entry.Key == username && entry.Value == password
。因此,如果字典 Credentials
和 Key==username
和 Value==password
中有 any 条目,它将 return true
。否则会returnfalse
!
对于有效的凭据(如 bob、password1),该方法将找到满足条件的字典条目,并且 return true
表明用户是有效的。如果用户名或密码不匹配,它将 return false.
更新
要从 csv
文件中读取用户详细信息,您可以使用此构造函数
public Authenticator()
{
var logins = File.ReadAllLines(@"C:\YourDirectory\users.csv");
foreach(var login in logins)
{
var parts = login.Split(',');
Credentials.Add(parts[0].Trim(), parts[1].Trim());
}
}
文件中的数据应该是这样的
bob,password
alice1,password1
$COTT,$PASSWORD
reallylongusername-string,reallylongpassword-string