如何在C#中使用字典实现密码验证程序

时间:2015-10-10 18:26:05

标签: c# validation dictionary login credentials

我想创建一个具有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);
    }
}

2 个答案:

答案 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");
    }
}