如何使用字典在 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。因此,如果字典 CredentialsKey==usernameValue==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