我想创建一个具有2个输入的控制台程序,并且有一个单独的类,其中包含带有硬编码/ 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);
}
}
答案 0 :(得分:2)
这就是你的程序的样子。在Authenticator类中添加一个方法,以验证一组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()
是Linq
上的Enumerable
扩展方法。它采用Func<T, bool>
形式的谓词,并返回boolean
值,指示是否在符合条件的枚举中找到任何项目。 MSDN reference这里。
此处,对于给定的用户名和密码集,条件为entry.Key == username && entry.Value == password
。因此,如果true
字典Credentials
中有任何条目,则会返回Key==username
&{ Value==password
。否则,它将返回false
!
对于有效凭证(如bob,password1),该方法将找到满足条件的字典条目,并返回用户有效的true
指示。如果用户名或密码中的任何一个不匹配,则返回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
答案 1 :(得分:1)
只要您的Credentials
集合为private
,您就无法从authenticator
课程之外访问它。因此,解决此问题的一种方法是在authenticator类中创建返回bool值并接受登录名和密码作为参数的方法:
public bool CheckPassword(string login, string password)
{
return Credentails.ContainsKey(login) && Credentails[login] == password;
}
然后在您的程序中,您可以实例化您的类并在需要时调用此方法:
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");
}
}