如何记住密码(winform界面)

toploveall 2009-12-21 09:48:54
界面上有一个用户名文本框和一个密码文本框,还有个记住密码复选框。一个登录按钮。
请问,记住密码功能怎么实现?
别人的建议:当勾选复选框时,把用户名和密码存储在一个xml文件中;当取消勾选时,把xml删除。这样在登录窗体启动的时候,看看有没有xml文件就可以了(有,则把xml文件中的用户名读到界面上;没有,则登录窗体的用户名和密码为空)。
我觉得这样做不是太好。把用户名和密码都暴露在文件中,不是个好的选择。

不知这个问题,怎么处理才好。

如果真的要写到一个xml文件中,请问怎么创建xml文件及它的元素,怎么读取xml中对应的元素。

xml文件形式如下:
<logininfo>
<name>admin</name>
<password>admin</password>
</logininfo>
...全文
602 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanpid 2010-01-22
  • 打赏
  • 举报
回复
序列化!
toploveall 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 l171147904 的回复:]
不管XML 还是 自定义文件存储!

安全与否,主要取决你的加密算法!


private string accountFilePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +"\\accounts.dat ";

private IDictionary <string, string> accounts = new SortedList <string, string>();

/// <summary>
        /// 记住密码
        /// </summary>
        private void ReloadAccounts()
        {
            this.txtUserName.AutoCompleteCustomSource.Clear();
            accounts.Clear();
            if (!File.Exists(accountFilePath))
            {
                return;
            }
            using (StreamReader reader = new StreamReader(accountFilePath))
            {
                while (true)
                {
                    string username = reader.ReadLine();
                    if (string.IsNullOrEmpty(username)) break;
                    string password = reader.ReadLine();
                    if (string.IsNullOrEmpty(password)) break;
                    accounts.Add(username, password);
                    txtUserName.AutoCompleteCustomSource.Add(username);
                }
            }
        }

/// <summary>
        /// 登录事件
        /// </summary>
        /// <param name="sender"> </param>
        /// <param name="e"> </param>
        private void btnLogin_Click(object sender, EventArgs e)
        {
            if (accounts.ContainsKey(this.txtUserName.Text))
            {
                accounts[this.txtUserName.Text] = this.txtUserPass.Text;
            }
            else
            {
                accounts.Add(this.txtUserName.Text, this.txtUserPass.Text);
            }

            using (StreamWriter writer = new StreamWriter(accountFilePath))
            {
                foreach (KeyValuePair <string, string> account in accounts)
                {
                    writer.WriteLine(account.Key);
                    writer.WriteLine(account.Value);
                }
            }

            ReloadAccounts();

            string user = this.txtUserName.Text.Trim(); 
            //加密
            string bbb = Crypto.EncryptData("jm", this.txtUserPass.Text.Trim());
            string pwd = bbb;

            string filter = "username='" + user + "'" + " and password='" + pwd + "'";

            DataTable loginTable = manager.selectAll("userlist", "*", filter);

            if (this.txtUserName.Text.Trim() == "" || bbb == "")
            {
                MessageBox.Show("用户名或密码不能为空!");
                this.txtUserName.Focus();
            }
            else if (loginTable.Rows.Count == 0)
            {
                MessageBox.Show("用户名或密码错误!");
                this.txtUserName.Focus();
            }
            else
            {
                MessageBox.Show("登录成功!");

            }
        } 

        //当鼠标离开用户名时自动获得密码
        private void txtUserName_Leave(object sender, EventArgs e)
        {
            string password = string.Empty;
            if (accounts.TryGetValue(this.txtUserName.Text, out password))
                this.txtUserPass.Text = password;
        }


[/Quote]

DataTable loginTable = manager.selectAll("userlist", "*", filter);
中的manager是上下文都没有,请问指什么?
l171147904 2009-12-21
  • 打赏
  • 举报
回复
不管XML 还是 自定义文件存储!

安全与否,主要取决你的加密算法!


private string accountFilePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +"\\accounts.dat ";

private IDictionary<string, string> accounts = new SortedList<string, string>();

/// <summary>
/// 记住密码
/// </summary>
private void ReloadAccounts()
{
this.txtUserName.AutoCompleteCustomSource.Clear();
accounts.Clear();
if (!File.Exists(accountFilePath))
{
return;
}
using (StreamReader reader = new StreamReader(accountFilePath))
{
while (true)
{
string username = reader.ReadLine();
if (string.IsNullOrEmpty(username)) break;
string password = reader.ReadLine();
if (string.IsNullOrEmpty(password)) break;
accounts.Add(username, password);
txtUserName.AutoCompleteCustomSource.Add(username);
}
}
}

/// <summary>
/// 登录事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLogin_Click(object sender, EventArgs e)
{
if (accounts.ContainsKey(this.txtUserName.Text))
{
accounts[this.txtUserName.Text] = this.txtUserPass.Text;
}
else
{
accounts.Add(this.txtUserName.Text, this.txtUserPass.Text);
}

using (StreamWriter writer = new StreamWriter(accountFilePath))
{
foreach (KeyValuePair<string, string> account in accounts)
{
writer.WriteLine(account.Key);
writer.WriteLine(account.Value);
}
}

ReloadAccounts();

string user = this.txtUserName.Text.Trim();
//加密
string bbb = Crypto.EncryptData("jm", this.txtUserPass.Text.Trim());
string pwd = bbb;

string filter = "username='" + user + "'" + " and password='" + pwd + "'";

DataTable loginTable = manager.selectAll("userlist", "*", filter);

if (this.txtUserName.Text.Trim() == "" || bbb == "")
{
MessageBox.Show("用户名或密码不能为空!");
this.txtUserName.Focus();
}
else if (loginTable.Rows.Count == 0)
{
MessageBox.Show("用户名或密码错误!");
this.txtUserName.Focus();
}
else
{
MessageBox.Show("登录成功!");

}
}

//当鼠标离开用户名时自动获得密码
private void txtUserName_Leave(object sender, EventArgs e)
{
string password = string.Empty;
if (accounts.TryGetValue(this.txtUserName.Text, out password))
this.txtUserPass.Text = password;
}

zhq_442577358 2009-12-21
  • 打赏
  • 举报
回复
加密
toploveall 2009-12-21
  • 打赏
  • 举报
回复
恩,我用的是MD5加密
linboc 2009-12-21
  • 打赏
  • 举报
回复
可以将存储信息编码了再存,比如BASE64编码,还有就是不一定要存到XML里那么工整的告诉别人这死什么,直接拼一个自己知道怎么拆解的字符串,然后写到一个文本文件里就行了

比如

string sparator = ((char)0x1f).ToString();
string[] info = new string[] { Convert.ToBase64String(Encoding.Default.GetBytes(name)), Convert.ToBase64String(Encoding.Default.GetBytes(password)) };
File.WriteAllText(savePath, string.Join(sparator, info));
shuli198869 2009-12-21
  • 打赏
  • 举报
回复
建议加密
szaf31954 2009-12-21
  • 打赏
  • 举报
回复
xml或者cookie 注意点就一个 加密或者掩码
不要让名码暴露在文件中
  • 打赏
  • 举报
回复
简单加一下密再保存在XML文件中
或者用二进制写文件,别人打开看到也是乱码
shuli198869 2009-12-21
  • 打赏
  • 举报
回复

创建:
//执行linq添加(xmlLOG)
XElement newLog = new XElement("logininfo"
, new XElement("name", "admin")
, new XElement("password", "admin")
);
//保存xml
newLog.Save(xmlPath);
读取:

XmlNode xn = xmlDoc.SelectSingleNode("logininfo");

XmlNodeList xnl = xn.ChildNodes;

foreach (XmlNode xnf in xnl)
{
XmlNodeList xnf1 = xe.ChildNodes;
foreach (XmlNode xn2 in xnf1)
{
Console.WriteLine(xn2.InnerText);//显示子节点点文本
}
}
Console.ReadKey();
amandag 2009-12-21
  • 打赏
  • 举报
回复
如果真的要写到一个xml文件中,请问怎么创建xml文件及它的元素,怎么读取xml中对应的元素。
==
这个并不难,使用System.XML命名空间相应的类即可

可参考"使用XmlTextWriter与XmlTextReader访问创建和读取XML文件"
http://blog.csdn.net/amandag/archive/2008/07/08/2623320.aspx

但使用这种机制的话,客户端很容易得到真实的用户名和密码,建议将其加密。

其他的思路也可以考虑如果用户勾选复选框时,想办法得到用户的一些物理信息(如网卡MAC地址),以后此地址可直接登录
hitlcyu19 2009-12-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangjianjianjianjia/archive/2009/11/06/4776397.aspx
cstester 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 toploveall 的回复:]

我觉得这样做不是太好。把用户名和密码都暴露在文件中,不是个好的选择。

[/Quote]

你可以用对象序列化,将用户密码 序列化出来,就不会裸漏给别人了。即使打开了也是乱码。
angel6709 2009-12-21
  • 打赏
  • 举报
回复
我思故我在
cstester 2009-12-21
  • 打赏
  • 举报
回复
可以用文件流写啊。。


string context="<logininfo>\r\n <name>{0}</name> \r\n <password>{1} </password>\r\n </logininfo>";
context= string.Format(context,"admin","admin");
FileStream stream = new FileStream(@"c:\login.xml");
StreamWriter w = new StreamWriter(stream);
w.Write(context);
stream.Dispose();


ali4130000 2009-12-21
  • 打赏
  • 举报
回复
加密了再存储
Return门徒 2009-12-21
  • 打赏
  • 举报
回复
cookie能实现,winForm的TextBox没有这个功能吗~!好像有联想功能~!
toploveall 2009-12-21
  • 打赏
  • 举报
回复
按照我自己的思路,完成了,可惜用户名和密码都是明码

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧