您的位置:首页 > 其它

基于XML的简单用户管理

2008-10-10 11:12 253 查看
在ASP.NET中,通常都使用数据库如SQL Server或Access来实现用户管理。对于简单的小站点来说,通常不需要这么复杂。本文使用XML来实现简单的用户管理功能。


首先来考虑我们的用户信息。

用户信息应该包括以下内容:

1。用户名称

2。密码,为了保证安全性,应该对密码进行简单加密,这里使用了MD5算法生成的摘要来保存密码

3。有效性

4。权限,这里仅简单的设计了一种权限即管理权限



有了这些信息,我们的XML文件(User.xml)应该如下所示:



<?xml version="1.0" encoding="utf-8"?>

<UserInfo>

<UserInfoNode name="admin" password="e10adc3949ba59abbe56e057f20f883e" available="1" isAdmin="1" />

<UserInfoNode name="igame" password="c33367701511b4f6020ec61ded352059" available="1" isAdmin="0" />

</UserInfo>

解释如下:

UserInfoNode节点的属性:

name:用户名

password:根据密码生成的MD5串

available:账号有效标志,1:有效,0:无效

isAdmin:管理权限标志,1:有权限,0:无权限



有了基本的用户账号数据库,可以着手进行实现了。

下面是账户管理类Account的实现:





using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Xml; // 偶们要使用XML

using System.Collections.Generic; // 偶们要使用List

namespace igame // 命名空间,igame当然使用igame

{

/// <summary>

/// Summary description for Account 偷懒,不写

/// </summary>

public class Account // 账号管理类

{

public struct UserInfoStruc // 用户信息的结构定义,注意:不包括密码域

{

public string userName; // 账号名称

public bool available; // 有效标志

public bool isAdmin; // 管理权限标志

}; // UserInfoStruc

private XmlDocument _xmlDoc = new XmlDocument(); // 生成XmlDocument对象,偶们以后的操作都针对它!

private string _filePath = string.Empty; // Xml账号文件的路径

public Account(string filepath) // 构造方法

{

//

// TODO: Add constructor logic here

//

if (System.IO.File.Exists(filepath)) // 检测XML文件存在性

{

_xmlDoc.Load(filepath); // 装载

_filePath = filepath; // 保存文件路径,更新了账号信息后,要保存滴!

}

} // Account

/// <summary>

/// 获取所有账号的列表

/// </summary>

/// <returns>UserInfoStruc[]</returns>

public UserInfoStruc[] getUserInfoList()

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 所有节点,对应于<UserInfoNode ...></UserInfoNode>

XmlNode node = null; // 当前节点

List<UserInfoStruc> res = new List<UserInfoStruc>(); // 返回值

for (int i = 0; i < nodelist.Count; i++) // 遍历

{

node = nodelist.Item(i); // 获取节点

// 获取账号信息,并填充到返回列表

UserInfoStruc uis = new UserInfoStruc();

uis.userName = node.Attributes["name"].Value.ToLower(); // 账号名

uis.available = node.Attributes["available"].Value == "1"; // 有效标志

uis.isAdmin = node.Attributes["isAdmin"].Value == "1"; // 管理权限

res.Add(uis);

}

return res.ToArray(); // 返回

} // getUserInfoList

/// <summary>

/// 内部使用,获取指定账号的所有信息,当然包括密码

/// </summary>

/// <param name="username"></param>

/// <param name="pwd">引用,密码</param>

/// <param name="available">引用,有效标志</param>

/// <param name="isAdmin">引用,管理权限</param>

/// <returns>成功或失败</returns>

private bool getUserInfo(string username, ref string pwd, ref bool available, ref bool isAdmin)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 账号信息节点列表

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 逐个比较

{

pwd = node.Attributes["password"].Value.ToLower();

available = node.Attributes["available"].Value == "1";

isAdmin = node.Attributes["isAdmin"].Value == "1";

return true; // 成功找到

}

}

return false; // 可耻滴失败鸟!

} // getUserInfo

/// <summary>

/// 对指定的账号密码进行验证

/// </summary>

/// <param name="username">账号名称</param>

/// <param name="pwd">密码</param>

/// <returns></returns>

public bool authenticate(string username, string pwd)

{

string md5Str = string.Empty;

bool available = false;

bool isAdmin = false;

if (getUserInfo(username, ref md5Str, ref available, ref isAdmin)) // 获取账号信息

{

return available && md5Str == CalcMD5.GetMD5(pwd).ToLower(); // 账号有效且MD5串契合则成功

}

return false; // 验证失败鸟!

}// authenticate

/// <summary>

/// 检测指定的账号是否存在

/// </summary>

/// <param name="username">账号名称</param>

/// <returns>存在与否</returns>

public bool userExists(string username)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 比较账号名称,相等则成功

{

return true;

}

}

return false; // 还是失败!

} // userExists

/// <summary>

/// 内部使用,创建新的XML节点属性对象

/// </summary>

/// <param name="name">属性名称</param>

/// <param name="value">属性值</param>

/// <returns>节点属性XmlAttribute对象</returns>

private XmlAttribute createNewAttr(string name, string value)

{

XmlAttribute attr = (XmlAttribute)_xmlDoc.CreateNode(XmlNodeType.Attribute, name, string.Empty);

attr.Value = value;

return attr;

} // createNewAttr

/// <summary>

/// 根据指定信息添加新账号,如果指定的账号存在,则更新之

/// </summary>

/// <param name="username">账号名称</param>

/// <param name="pwd">密码</param>

/// <param name="available">有效标志</param>

/// <param name="_isadmin">管理权限</param>

/// <returns>成功或失败</returns>

public bool addUser(string username, string pwd, bool available, bool _isadmin)

{

if (!userExists(username)) // 用户不存在?

{

// 创建账号节点

XmlNode node = _xmlDoc.CreateNode(XmlNodeType.Element, "UserInfoNode", string.Empty);

// 生成账号信息

node.Attributes.Append(createNewAttr("name", username));

node.Attributes.Append(createNewAttr("password", CalcMD5.GetMD5(pwd.ToLower()))); // 根据密码字符串生成MD5串

node.Attributes.Append(createNewAttr("available", available ? "1" : "0"));

node.Attributes.Append(createNewAttr("isAdmin", _isadmin ? "1" : "0"));

_xmlDoc.DocumentElement.AppendChild(node); // 添加

_xmlDoc.Save(_filePath); // 保存

return true;

}

else

return updUser(username, pwd, available, _isadmin); // 存在则更新之

} // addUser

/// <summary>

/// 更新指定账号的信息

/// </summary>

/// <param name="username">账号名称</param>

/// <param name="pwd">密码</param>

/// <param name="available">有效标志</param>

/// <param name="_isadmin">管理权限</param>

/// <returns>成功或失败</returns>

public bool updUser(string username, string pwd, bool available, bool _isadmin)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账号存在?

{

if (pwd != null && pwd.Length > 0) // 密码必须有效,否则无法登录哦!

node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();

node.Attributes["available"].Value = available ? "1" : "0";

node.Attributes["isAdmin"].Value = _isadmin ? "1" : "0";

_xmlDoc.Save(_filePath); // 别忘了保存

return true; // 成功返回

}

}

return false; // 失败

} // updUser

/// <summary>

/// 更新指定账号的密码

/// </summary>

/// <param name="username">账户名称</param>

/// <param name="pwd">密码</param>

/// <returns>成功或失败</returns>

public bool updPwd(string username, string pwd)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower())

{

if (pwd != null && pwd.Length > 0) // 仅当密码有效时进行更新

{

node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();

_xmlDoc.Save(_filePath);

return true;

}

else

break;

}

}

return false;

} // updPwd

/// <summary>

/// 删除指定的账户

/// </summary>

/// <param name="username">指定的账户名称</param>

/// <returns></returns>

public bool removeUser(string username)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账户契合?

{

_xmlDoc.DocumentElement.RemoveChild(node); // 删除之

_xmlDoc.Save(_filePath); // 保存更新

return true;

}

}

return false;

} // removeUser

/// <summary>

/// 检验指定账户的管理权限

/// </summary>

/// <param name="username">账户名称</param>

/// <returns>成功或失败</returns>

public bool isAdmin(string username)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower())

{

return node.Attributes["isAdmin"].Value == "1"; // 必须等于1

}

}

return false;

} // isAdmin

/// <summary>

/// 检验指定的账户是否有效

/// </summary>

/// <param name="username">指定的账户名称</param>

/// <returns>有效与否</returns>

public bool isAvailable(string username)

{

XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;

XmlNode node = null;

for (int i = 0; i < nodelist.Count; i++)

{

node = nodelist.Item(i);

if (node.Attributes["name"].Value.ToLower() == username.ToLower())

{

return node.Attributes["available"].Value == "1"; // 必须等于1

}

}

return false;

} // isAvailable

} // class Account

} // namespace igame

下面是关于MD5计算的实现:



using System;

using System.Collections.Generic;

using System.Text;

using System.Security.Cryptography;

namespace igame

{

public class CalcMD5

{

public static string GetMD5(string s)

{

/// <summary>

/// 与ASP兼容的MD5加密算法

/// </summary>

MD5 md5 = new MD5CryptoServiceProvider();

byte[] t = md5.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(s));

StringBuilder sb = new StringBuilder(32);

for (int i = 0; i < t.Length; i++)

{

sb.Append(t[i].ToString("x").PadLeft(2, '0'));

}

return sb.ToString();

}

}

}

OK,完成鸟。

此乃末技。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: