1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Web; 5 using System.Web.Security; 6 using System.IO; 7 using System.Collections.Specialized; 8 9 namespace MOSSSecurity 10 { 11 public class TextFileMembershipProvider : MembershipProvider 12 { 13 private String _sFilePath = ""; 14 15 public String FilePath 16 { 17 get { return _sFilePath; } 18 } 19 20 private IDictionary<String, String> LoadAllUsers() 21 { 22 if (String.IsNullOrEmpty(this.FilePath)) 23 { 24 throw new InvalidOperationException("FilePath is not set."); 25 } 26 27 28 Dictionary<String, String> result = new Dictionary<String, String>(); 29 30 StreamReader reader = new StreamReader(FilePath, Encoding.Default); 31 while (true) 32 { 33 String sLine = reader.ReadLine(); 34 if (sLine == null) 35 { 36 break; 37 } 38 if (sLine.Trim().Length == 0) 39 { 40 continue; 41 } 42 String[] line = sLine.Split(':'); 43 result.Add(line[0], line[1]); 44 } 45 46 return result; 47 } 48 49 private void WriteAllUsers(IDictionary<String, String> users) 50 { 51 if (String.IsNullOrEmpty(this.FilePath)) 52 { 53 throw new InvalidOperationException("FilePath is not set."); 54 } 55 56 using (StreamWriter writer = new StreamWriter(this.FilePath, false)) 57 { 58 foreach (String userId in users.Keys) 59 { 60 writer.WriteLine(userId + ":" + users[userId]); 61 } 62 } 63 } 64 65 public override void Initialize(string name, NameValueCollection config) 66 { 67 base.Initialize(name, config); 68 69 _sFilePath = config["filePath"]; 70 } 71 72 public override string ApplicationName 73 { 74 get 75 { 76 return "/"; 77 } 78 set 79 { 80 81 } 82 } 83 84 public override bool ChangePassword(string username, string oldPassword, string newPassword) 85 { 86 return true; 87 } 88 89 public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) 90 { 91 return true; 92 } 93 94 public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 95 { 96 IDictionary<String, String> users = this.LoadAllUsers(); 97 if (users.ContainsKey(username)) 98 { 99 status = MembershipCreateStatus.DuplicateUserName;100 return null;101 }102103 users.Add(username, password);104 this.WriteAllUsers(users);105106 status = MembershipCreateStatus.Success;107108 MembershipUser user = new MembershipUser(this.Name, username, username, email, passwordQuestion, "", isApproved, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);109 return user;110 }111112 public override bool DeleteUser(string username, bool deleteAllRelatedData)113 { 114 IDictionary<String, String> users = this.LoadAllUsers();115 if (users.ContainsKey(username))116 { 117 users.Remove(username);118 this.WriteAllUsers(users);119 return true;120 }121 else122 { 123 return false;124 }125 }126127 public override bool EnablePasswordReset128 { 129 get { return false; }130 }131132 public override bool EnablePasswordRetrieval133 { 134 get { return false; }135 }136137 public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)138 { 139 totalRecords = 0;140 return null;141 }142143 public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)144 { 145 MembershipUserCollection result = new MembershipUserCollection();146147 IDictionary<String, String> users = this.LoadAllUsers();148 foreach (String username in users.Keys)149 { 150 if (username.StartsWith(usernameToMatch))151 { 152 result.Add(this.GetUser(usernameToMatch, false));153 }154 }155156 totalRecords = users.Count;157 return result;158 }159160 public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)161 { 162 MembershipUserCollection result = new MembershipUserCollection();163164 IDictionary<String, String> users = this.LoadAllUsers();165 foreach (String username in users.Keys)166 { 167 result.Add(this.GetUser(username, false));168 }169170 totalRecords = users.Count;171 return result;172 }173174 public override int GetNumberOfUsersOnline()175 { 176 return 0;177 }178179 public override string GetPassword(string username, string answer)180 { 181 return "";182 }183184 public override MembershipUser GetUser(string username, bool userIsOnline)185 { 186 IDictionary<String, String> users = this.LoadAllUsers();187 if (users.ContainsKey(username))188 { 189 MembershipUser result = new MembershipUser(this.Name, username, username, "", "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);190 return result;191 }192 else193 { 194 return null;195 }196 }197198 public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)199 { 200 return this.GetUser(providerUserKey.ToString(), userIsOnline);201 }202203 public override string GetUserNameByEmail(string email)204 { 205 return "";206 }207208 public override int MaxInvalidPasswordAttempts209 { 210 get { return 999; }211 }212213 public override int MinRequiredNonAlphanumericCharacters214 { 215 get { return 0; }216 }217218 public override int MinRequiredPasswordLength219 { 220 get { return 1; }221 }222223 public override int PasswordAttemptWindow224 { 225 get { return 999; }226 }227228 public override MembershipPasswordFormat PasswordFormat229 { 230 get { return MembershipPasswordFormat.Clear; }231 }232233 public override string PasswordStrengthRegularExpression234 { 235 get { return ""; }236 }237238 public override bool RequiresQuestionAndAnswer239 { 240 get { return false; }241 }242243 public override bool RequiresUniqueEmail244 { 245 get { return false; }246 }247248 public override string ResetPassword(string username, string answer)249 { 250 return "";251 }252253 public override bool UnlockUser(string userName)254 { 255 return true;256 }257258 public override void UpdateUser(MembershipUser user)259 { 260 261 }262263 public override bool ValidateUser(string username, string password)264 { 265 try266 { 267 ExceptionMgt.Publish(new Exception(username + "|" + password));268269 IDictionary<String, String> users = this.LoadAllUsers();270 if (!users.ContainsKey(username))271 { 272 return false;273 }274 if (users[username] != password)275 { 276 return false;277 }278279 return true;280 }281 catch (Exception ex)282 { 283 ExceptionMgt.Publish(ex);284 return false;285 }286 }287 }288} 289