【问题标题】:Read credentials in text file for program c#?读取程序 c# 的文本文件中的凭据?
【发布时间】:2014-11-10 03:52:24
【问题描述】:

这是我的程序,如果我输入用户名和密码,它就可以正常工作:

 try
 {

     var url = @"https://mail.google.com/mail/feed/atom";
     var User = username;
     var Pasw = password;
     var encoded = TextToBase64(User + ":" + Pasw);
     var myweb = HttpWebRequest.Create(url) as HttpWebRequest;
     myweb.Method = "POST";
     myweb.ContentLength = 0;
     myweb.Headers.Add("Authorization", "Basic " + encoded);
     var response = myweb.GetResponse();
     var stream = response.GetResponseStream();
     textBox1.Text += ("Connection established with" + User + Pasw);
 }
 catch (Exception ex)
 {
     textBox1.Text += ("Error connection. Original error: " + ex.Message);

现在我想读取 texfile 的字符串,将它们拆分并读取用户名和密码,格式如下: username:password 。目前有我的代码:

 Stream myStream = null;
 OpenFileDialog openFileDialog1 = new OpenFileDialog();

 openFileDialog1.InitialDirectory = "c:\\";
 openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
 openFileDialog1.FilterIndex = 2;
 openFileDialog1.RestoreDirectory = true;

 string file_name = "";
 file_name = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + file_name;

 if (openFileDialog1.ShowDialog() == DialogResult.OK)
 {

      try
      {        
           if ((myStream = openFileDialog1.OpenFile()) != null)
           {

               using (StringReader reader = new StringReader(file_name))
               {
                    // Loop over the lines in the string.
                    int count = 0;
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                         string[] data = line.Split(':');
                         string username = data[0].Trim();
                         string password = data[1].Trim();

                         count++;
                 /*       Console.WriteLine("Line {0}: {1}", count, line);    */
               }
               reader.Close();
           }
       }
  }
  catch (Exception ex)
  {
       MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
  }

【问题讨论】:

  • 您能澄清一下您的问题吗?
  • @rintintin 你在 try-catch 语句中发现错误,我理解了吗?如果是,请说明是哪个错误。
  • 你还没问过问题
  • 错误是程序没有从文本文件中获取用户名和密码
  • 为什么不打印所有行来检查它是否读取?在拆分它并访问索引之前

标签: c# string file-io


【解决方案1】:

您打开用户选择的文件,然后尝试从变量 file_name 中读取,该变量不是文件名,而是众所周知的文件夹的名称。也许你想要这个

try
{        
    if (openFileDialog1.FileName != string.Empty)
    {
        using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
        {
           ....
        }
    }
}

在相同的代码中,您使用 StringReader,但您需要 StreamReader 来读取文件。 StringReader 获取在其构造函数中传递的值并在 ReadLine 调用中返回。然后您在冒号处拆分该行,但这当然不是您文件的内容。

您的代码中还有其他问题。例如,您如何处理从线路加载的用户名和密码?它们被声明为局部变量并且不在任何地方使用,因此在下一个循环中它们被覆盖并丢失。

因此,UserData 类可能是一个可能的答案

public class UserData
{ 
    public string UserName {get; set;}
    public string Password {get; set;}
}

并以全局级别的形式声明一个

 List<UserData> data = new List<UserData>

在你的循环中

public void button1_Click(object sender, EventArgs e)    
{    
    try
    {        
        if (openFileDialog1.FileName != string.Empty)
        {
            using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
            {
                int count = 0;
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    UserData d = new UserData();
                    string[] parts = line.Split(':');
                    d.UserName = parts[0].Trim();
                    d.Password = parts[1].Trim();
                    data.Add(d);
                }

                // At the loop end you could use the List<UserData> like a normal array
                foreach(UserData ud in data)
                {
                    Console.WriteLine("User=" + dd.UserName + " with password=" + dd.Password);
                }
            }
        }
    }
}


public void button2_Click(object sender, EventArgs e)
{
    try
    {
         if(data.Count() == 0)
         {
             MessageBox.Show("Load user info first");
             return;
         }

         var url = @"https://mail.google.com/mail/feed/atom";
         var encoded = TextToBase64(data[0].UserName + ":" + data[0].Password);         
         .....

警告说明。当然这只是演示代码。请记住,在实际场景中,以明文形式保存密码是一个很大的安全问题。其影响与您的应用程序的上下文相关,但不应被低估。更好的做法是存储 hashing of the password 值并在需要比较密码时应用相同的哈希函数

【讨论】:

  • 好的,但是在程序中它说用户名,密码在当前上下文中不存在
  • 但是您的文件中有多少行?上面的代码创建了在 UserData 实例中转换的这些行的列表。当然,您需要将这些实例之一的值传递给上面的方法。类似var encoded = TextToBase64(data[0].UserName + ":" + data[0].Password);
  • 不能。它给了我错误。但我会知道如何运行“var User = username; 错误如:当前上下文中不存在
  • 解决了所有问题。刚才想了一个小问题,不知道是不是应该这样:var count never be used.
  • 试过了:foreach (UserData ud in data) { textBox1.Text += (ud.username + ud.password); } 并返回文件的路径,(目录)不是用户名和密码。 (在按钮 1 中)
【解决方案2】:

您正在从file_name varialbe 创建 StringReader,即(根据您的代码)

string file_name = "";
        file_name = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + file_name;

并且指向那里。

您还为使用open file dialog 选择的文件创建了流,但您还没有使用此流。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2021-11-02
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多