Поскольку обычные классы словарей не
Поскольку обычные классы словарей не могут быть использованы классом форматирования XmlSerialiser, то список пользователей реализует интерфейс IXmlSerializable.
[XmlRoot("users")] public class UsersList: IXmlSerializable { private Dictionary<string, string> usersField;
public Dictionary<string, string> Users { get {return usersField;} }
public UsersList() { usersField = new Dictionary<string, string>(); }
public void ReadXml(XmlReader reader) { reader.Read(); while (reader.NodeType != XmlNodeType.EndElement) { Users.Add(reader.GetAttribute("username"), reader.GetAttribute("password")); reader.Read(); } }
public void WriteXml(XmlWriter writer) { foreach (string user in Users.Keys) { writer.WriteStartElement("user"); writer.WriteAttributeString("username", user); writer.WriteAttributeString("password", this.Users[user]); writer.WriteEndElement(); } }
public XmlSchema GetSchema() { return null; }
Листинг 7.1.
Метод NewUser используется для добавления нового пользователя.
public void NewUser(string userName, string password, bool hashed) { if (Users.ContainsKey(userName)) { throw new ApplicationException("Duplicate username."); } if (hashed) { password = Utils.HashedPassword(password); }
Users.Add(userName, password); }
Методы Load и Save записывают список пользователей и их паролей (или их образов) в файл.
public static UsersList Load(string fileName) { XmlSerializer serializer = new XmlSerializer(typeof(UsersList)); using (StreamReader reader = new StreamReader(fileName)) { return (UsersList) serializer.Deserialize(reader); }; }
public void Save(string fileName) { XmlSerializer serializer = new XmlSerializer(typeof(UsersList)); using (StreamWriter writer = new StreamWriter(fileName)) { serializer.Serialize(writer, this); }; } }
Статический класс Utils облегчает вызов функции хеширования и преобразует ее результат в строку.
static class Utils { public static string HashedPassword(string password) { SHA1CryptoServiceProvider crypto = new SHA1CryptoServiceProvider();
byte[] inputBuffer = Encoding.Unicode.GetBytes(password); return Convert.ToBase64String(crypto.ComputeHash(inputBuffer)); } }
Следующий make файл создает сборку расширения c менеджером пользователей и регистрирует ее в GAC после команды nmake && nmake install.
Содержание Назад Вперед