带有 XML 文件的身份验证表单

Posted

技术标签:

【中文标题】带有 XML 文件的身份验证表单【英文标题】:Authentication form with a XML file 【发布时间】:2019-01-22 11:32:58 【问题描述】:

我需要有关此身份验证表单的帮助。

这是xml文件:

  <USER_LIST>
    <user>
      <name>giulio</name>
      <password>prova</password>
    </user>
    <user>
      <name>giulia</name>
      <password>prova1</password>
    </user>
    <user>
      <name>renato</name>
      <password>zero</password>
    </user>
  </USER_LIST>

这是我写的代码:

private void button4_Click(object sender, EventArgs e)
        

            XmlDocument doc = new XmlDocument();

            doc.Load("dati.txt");

            foreach (XmlNode node in doc.SelectNodes("//user"))
            
                String User = node.SelectSingleNode("name").InnerText;
                String Pass = node.SelectSingleNode("password").InnerText;

                if (User == textBox1.Text && Pass == textBox2.Text)
                
                    button1.Visible = true;
                    dlt_btn.Visible = true;
                    button3.Visible = true;
                    button3.Visible = true;
                    button5.Visible = true;
                    return;
                

                else
                
                    MessageBox.Show("Invalid Username or Password!");
                
             
        

但是像这样,例如,如果我使用名称“renato”和密码“零”登录 它给了我两次消息框“无效的用户名或密码!”第三次显示所需的按钮。我知道为什么,但我想不出另一种方法来做到这一点。这是我的第一个项目,我像昨天一样开始编码,所以如果问你这样愚蠢的事情,我很抱歉。

提前感谢您的帮助!

【问题讨论】:

因为循环会一一检查所有节点,并且对于与给定用户/通行证不匹配的每个节点,都会显示消息框。 请不要这样做。您的系统不安全,您正在存储明文密码! 我想这只是为了学习目的,否则显然不安全。 【参考方案1】:

我想这只是为了学习目的或作业应该保持简单,否则根本不安全。

您不需要使用循环。目前,您的循环循环一一检查所有节点,并且对于与给定用户/通行证不匹配的每个节点,显示消息框,这就是为什么您会看到消息框,直到循环到达正确的用户/通行证。

不使用循环,您可以通过这种方式轻松检查给定的用户/密码是否存在于您的 xml 文件中:

var userName = userNameTextBox.Text;
var password = passwordTextBox.Text;
var match = System.Xml.Linq.XElement.Load(@"d:\users.xml")
    .Elements("user")
    .Where(x => x.Element("name")?.Value == userName &&
                x.Element("password")?.Value == password)
    .Any();

然后如果match 不正确,您可以显示消息框。

【讨论】:

是的,它只是为了学习!无论如何,我尝试了您的解决方案,但如果用户名和密码正确,var match 也保持错误... 我不知道为什么但它不起作用,var匹配总是错误的...... 可能是因为在代码中使用用户名文本框而不是密码文本框之类的错误。【参考方案2】:

问题是每次检查 XML 中不匹配的条目时都会显示消息框。

对您的代码进行最少更改的最简单方法如下:

private void button4_Click(object sender, EventArgs e)

    XmlDocument doc = new XmlDocument();
    doc.Load("dati.txt");

    bool found = false;

    foreach (XmlNode node in doc.SelectNodes("//user"))
    
        String User = node.SelectSingleNode("name").InnerText;
        String Pass = node.SelectSingleNode("password").InnerText;

        if (User == textBox1.Text && Pass == textBox2.Text)
        
            found = true;
            break;
        
    

    if (found)
    
        button1.Visible = true;
        dlt_btn.Visible = true;
        button3.Visible = true;
        button3.Visible = true;
        button5.Visible = true;
    
    else
    
        MessageBox.Show("Invalid Username or Password!");
    
 

我们创建一个名为found 的变量并将其设置为false。这是为了确保如果 XML 为空或没有匹配项,我们将无法通过检查。

然后我们循环遍历结果,如果找到匹配项,我们设置found = true。我们调用 break 来跳出循环。

一旦循环完成,我们检查局部变量是否为真:

if (found)

这是if (found == true)的简写

如果是真的,那么我们会像以前一样启用您的按钮。如果不正确,则显示错误消息。

它只会显示一次错误信息。

【讨论】:

我按照你说的尝试过(我之前也试过这样)但是当我设置为用户并通过第三个(renato 零)时,它给了我两次无效的用户和密码并且没有t 告诉我所有的按钮。如果我放置第一个用户并通过(giulio prova),它根本不会显示任何内容 你能试着从上面复制我的代码并使用它吗?除非您按两次按钮,否则它不会显示两次错误消息。 我刚刚用我上面的代码和你的 xml 文件测试了这个,我只看到一次使用 renato/zero 的错误消息。 我复制并粘贴了您的代码,但它确实不起作用,我不明白为什么。但是根据您对 bool 标志的建议,我找到了解决方案,我将其发布给您【参考方案3】:

这是一个可行的解决方案:

private void button4_Click(object sender, EventArgs e)

    string username;
    string password;
    string CurrentUser = "";
    string CurrentPwd = "";
    bool LoginStatus = false;

    username = textBox1.Text;
    password = textBox2.Text;

    XmlDocument xmxdoc = new XmlDocument();
    xmxdoc.Load("dati.txt");
    XmlNodeList xmlnodelist = xmxdoc.GetElementsByTagName("user");

    foreach (XmlNode xn in xmlnodelist)
    
        XmlNodeList xmlnl = xn.ChildNodes;
        foreach (XmlNode xmln in xmlnl)
        
            if (xmln.Name == "name")
            
                if (xmln.InnerText == username)
                
                    CurrentUser = username;
                
            
            if (xmln.Name == "password")
            
                if (xmln.InnerText == password)
                
                    CurrentPwd = password;
                
            
        
        if ((CurrentUser != "") & (CurrentPwd != ""))
        
            LoginStatus = true;
        
    
    if (LoginStatus == true)
    
        button1.Visible = true;
        dlt_btn.Visible = true;
        button3.Visible = true;
        button3.Visible = true;
        button5.Visible = true;
        return;
    
    else
    
        MessageBox.Show("Invalid Username or Password!");
    

【讨论】:

以上是关于带有 XML 文件的身份验证表单的主要内容,如果未能解决你的问题,请参考以下文章

表单身份验证重定向 css/脚本包含到带有 HTTP 302 的登录页面

带有内置登录视图和身份验证表单的 Django “记住我”

带有新身份验证方法的 Symfony 简单登录表单不起作用

表单身份验证超时与会话超时

Ajax 和表单身份验证

(Monaca,Cordova)带有表单身份验证(Cookie)的 Web API 请求不起作用