温馨提示:代码在线浏览功能只能做为源码浏览参考,如果想更进一步了解该代码请下载:LiveBlog v1.0测试版源码
当前文件:
LiveBlog/LiveBlog.Core/Providers/XmlProvider/XmlMembershipProvider.cs[18K,2009-6-12 11:47:02],打开代码结构图
LiveBlog/LiveBlog.Core/Providers/XmlProvider/XmlMembershipProvider.cs[18K,2009-6-12 11:47:02],打开代码结构图1Using#region Using 2
3
using System; 4
using System.Xml; 5
using System.Collections.Generic; 6
using System.Collections.Specialized; 7
using System.Configuration.Provider; 8
using System.Web.Security; 9
using System.Globalization; 10
using System.Web.Hosting; 11
using System.Web.Management; 12
using System.Security.Permissions; 13
using System.Web; 14
using System.Text; 15
using System.Security.Cryptography; 16
17
#endregion 18
19
namespace LiveBlog.Core.Providers ...{ 20
/**//// <summary> 21
/// 22
/// </summary> 23
public class XmlMembershipProvider : MembershipProvider ...{ 24
private Dictionary<string, MembershipUser> _Users; 25
private string _XmlFileName; 26
27
Properties#region Properties 28
29
// MembershipProvider Properties 30
/**//// <summary> 31
/// 32
/// </summary> 33
public override string ApplicationName ...{ 34
get ...{ throw new NotSupportedException(); } 35
set ...{ throw new NotSupportedException(); } 36
} 37
38
/**//// <summary> 39
/// 40
/// </summary> 41
public override bool EnablePasswordRetrieval ...{ 42
get ...{ return false; } 43
} 44
45
/**//// <summary> 46
/// 47
/// </summary> 48
public override bool EnablePasswordReset ...{ 49
get ...{ return false; } 50
} 51
52
/**//// <summary> 53
/// 54
/// </summary> 55
public override int MaxInvalidPasswordAttempts ...{ 56
get ...{ return 5; } 57
} 58
59
/**//// <summary> 60
/// 61
/// </summary> 62
public override int MinRequiredNonAlphanumericCharacters ...{ 63
get ...{ return 0; } 64
} 65
66
/**//// <summary> 67
/// 68
/// </summary> 69
public override int MinRequiredPasswordLength ...{ 70
get ...{ return 8; } 71
} 72
73
/**//// <summary> 74
/// 75
/// </summary> 76
public override int PasswordAttemptWindow ...{ 77
get ...{ throw new NotSupportedException(); } 78
} 79
80
/**//// <summary> 81
/// 82
/// </summary> 83
public override MembershipPasswordFormat PasswordFormat ...{ 84
get ...{ return MembershipPasswordFormat.Clear; } 85
} 86
87
/**//// <summary> 88
/// 89
/// </summary> 90
public override string PasswordStrengthRegularExpression ...{ 91
get ...{ throw new NotSupportedException(); } 92
} 93
94
/**//// <summary> 95
/// 96
/// </summary> 97
public override bool RequiresQuestionAndAnswer ...{ 98
get ...{ return false; } 99
} 100
101
/**//// <summary> 102
/// 103
/// </summary> 104
public override bool RequiresUniqueEmail ...{ 105
get ...{ return false; } 106
} 107
108
#endregion 109
110
Supported methods#region Supported methods 111
112
/**//// <summary> 113
/// 114
/// </summary> 115
/// <param name="name"></param> 116
/// <param name="config"></param> 117
public override void Initialize(string name, NameValueCollection config) ...{ 118
if (config == null) 119
throw new ArgumentNullException("config"); 120
121
if (String.IsNullOrEmpty(name)) 122
name = "XmlMembershipProvider"; 123
124
if (Type.GetType("Mono.Runtime") != null) ...{ 125
// Mono dies with a "Unrecognized attribute: description" if a description is part of the config. 126
if (!string.IsNullOrEmpty(config["description"])) ...{ 127
config.Remove("description"); 128
} 129
} else ...{ 130
if (string.IsNullOrEmpty(config["description"])) ...{ 131
config.Remove("description"); 132
config.Add("description", "XML membership provider"); 133
} 134
} 135
136
base.Initialize(name, config); 137
138
// Initialize _XmlFileName and make sure the path 139
// is app-relative 140
string path = config["xmlFileName"]; 141
142
if (String.IsNullOrEmpty(path)) 143
path = BlogSettings.Instance.StorageLocation + "users.xml"; 144
145
if (!VirtualPathUtility.IsAppRelative(path)) 146
throw new ArgumentException 147
("xmlFileName must be app-relative"); 148
149
string fullyQualifiedPath = VirtualPathUtility.Combine 150
(VirtualPathUtility.AppendTrailingSlash 151
(HttpRuntime.AppDomainAppVirtualPath), path); 152
153
_XmlFileName = HostingEnvironment.MapPath(fullyQualifiedPath); 154
config.Remove("xmlFileName"); 155
156
// Make sure we have permission to read the XML data source and 157
// throw an exception if we don't 158
FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, _XmlFileName); 159
permission.Demand(); 160
161
// Throw an exception if unrecognized attributes remain 162
if (config.Count > 0) ...{ 163
string attr = config.GetKey(0); 164
if (!String.IsNullOrEmpty(attr)) 165
throw new ProviderException("Unrecognized attribute: " + attr); 166
} 167
} 168
169
/**//// <summary> 170
/// Returns true if the username and password match an exsisting user. 171
/// </summary> 172
public override bool ValidateUser(string username, string password) ...{ 173
if (String.IsNullOrEmpty(username) || String.IsNullOrEmpty(password)) 174
return false; 175
176
try ...{ 177
ReadMembershipDataStore(); 178
179
// Validate the user name and password 180
MembershipUser user; 181
if (_Users.TryGetValue(username, out user)) ...{ 182
if (user.Comment == password) // Case-sensitive 183
...{ 184
//user.LastLoginDate = DateTime.Now; 185
//UpdateUser(user); 186
return true; 187
} 188
} 189
190
return false; 191
} catch (Exception) ...{ 192
return false; 193
} 194
} 195
196
/**//// <summary> 197
/// Retrieves a user based on his/hers username. 198
/// the userIsOnline parameter is ignored. 199
/// </summary> 200
public override MembershipUser GetUser(string username, bool userIsOnline) ...{ 201
if (String.IsNullOrEmpty(username)) 202
return null; 203
204
ReadMembershipDataStore(); 205
206
// Retrieve the user from the data source 207
MembershipUser user; 208
if (_Users.TryGetValue(username, out user)) 209
return user; 210
211
return null; 212
} 213
214
/**//// <summary> 215
/// Retrieves a collection of all the users. 216
/// This implementation ignores pageIndex and pageSize, 217
/// and it doesn't sort the MembershipUser objects returned. 218
/// </summary> 219
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) ...{ 220
ReadMembershipDataStore(); 221
MembershipUserCollection users = new MembershipUserCollection(); 222
223
foreach (KeyValuePair<string, MembershipUser> pair in _Users) ...{ 224
users.Add(pair.Value); 225
} 226
227
totalRecords = users.Count; 228
return users; 229
} 230
231
/**//// <summary> 232
/// Changes a users password. 233
/// </summary> 234
public override bool ChangePassword(string username, string oldPassword, string newPassword) ...{ 235
XmlDocument doc = new XmlDocument(); 236
doc.Load(_XmlFileName); 237
XmlNodeList nodes = doc.GetElementsByTagName("User"); 238
foreach (XmlNode node in nodes) ...{ 239
if (node["UserName"].InnerText.Equals(username, StringComparison.OrdinalIgnoreCase) 240
|| node["Password"].InnerText.Equals(oldPassword, StringComparison.OrdinalIgnoreCase)) ...{ 241
node["Password"].InnerText = newPassword; 242
doc.Save(_XmlFileName); 243
244
_Users = null; 245
ReadMembershipDataStore(); 246
return true; 247
} 248
} 249
250
return false; 251
} 252
253
/**//// <summary> 254
/// Creates a new user store he/she in the XML file 255
/// </summary> 256
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) ...{ 257
XmlDocument doc = new XmlDocument(); 258
doc.Load(_XmlFileName); 259
260
XmlNode xmlUserRoot = doc.CreateElement("User"); 261
XmlNode xmlUserName = doc.CreateElement("UserName"); 262
XmlNode xmlPassword = doc.CreateElement("Password"); 263
XmlNode xmlEmail = doc.CreateElement("Email"); 264
XmlNode xmlLastLoginTime = doc.CreateElement("LastLoginTime"); 265
266
xmlUserName.InnerText = username; 267
xmlPassword.InnerText = password; 268
xmlEmail.InnerText = email; 269
xmlLastLoginTime.InnerText = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); 270
271
xmlUserRoot.AppendChild(xmlUserName); 272
xmlUserRoot.AppendChild(xmlPassword); 273
xmlUserRoot.AppendChild(xmlEmail); 274
xmlUserRoot.AppendChild(xmlLastLoginTime); 275
276
doc.SelectSingleNode("Users").AppendChild(xmlUserRoot); 277
doc.Save(_XmlFileName); 278
279
status = MembershipCreateStatus.Success; 280
MembershipUser user = new MembershipUser(Name, username, username, email, passwordQuestion, password, isApproved, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.MaxValue); 281
_Users.Add(username, user); 282
return user; 283
} 284
285
/**//// <summary> 286
/// Deletes the user from the XML file and 287
/// removes him/her from the internal cache. 288
/// </summary> 289
public override bool DeleteUser(string username, bool deleteAllRelatedData) ...{ 290
XmlDocument doc = new XmlDocument(); 291
doc.Load(_XmlFileName); 292
293
foreach (XmlNode node in doc.GetElementsByTagName("User")) ...{ 294
if (node.ChildNodes[0].InnerText.Equals(username, StringComparison.OrdinalIgnoreCase)) ...{ 295
doc.SelectSingleNode("Users").RemoveChild(node); 296
doc.Save(_XmlFileName); 297
_Users.Remove(username); 298
return true; 299
} 300
} 301
302
return false; 303
} 304
305
/**//// <summary> 306
/// Get a user based on the username parameter. 307
/// the userIsOnline parameter is ignored. 308
/// </summary> 309
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) ...{ 310
if (providerUserKey == null) 311
throw new ArgumentNullException("providerUserKey"); 312
313
XmlDocument doc = new XmlDocument(); 314
doc.Load(_XmlFileName); 315
316
foreach (XmlNode node in doc.SelectNodes("//User")) ...{ 317
if (node.ChildNodes[0].InnerText.Equals(providerUserKey.ToString(), StringComparison.OrdinalIgnoreCase)) ...{ 318
string userName = node.ChildNodes[0].InnerText; 319
string password = node.ChildNodes[1].InnerText; 320
string email = node.ChildNodes[2].InnerText; 321
DateTime lastLoginTime = DateTime.Parse(node.ChildNodes[3].InnerText, CultureInfo.InvariantCulture); 322
return new MembershipUser(Name, providerUserKey.ToString(), providerUserKey, email, string.Empty, password, true, false, DateTime.Now, lastLoginTime, DateTime.Now, DateTime.Now, DateTime.MaxValue); 323
} 324
} 325
326
return default(MembershipUser); 327
} 328
329
/**//// <summary> 330
/// Retrieves a username based on a matching email. 331
/// </summary> 332
public override string GetUserNameByEmail(string email) ...{ 333
if (email == null) 334
throw new ArgumentNullException("email"); 335
336
XmlDocument doc = new XmlDocument(); 337
doc.Load(_XmlFileName); 338
339
foreach (XmlNode node in doc.GetElementsByTagName("User")) ...{ 340
if (node.ChildNodes[2].InnerText.Equals(email.Trim(), StringComparison.OrdinalIgnoreCase)) ...{ 341
return node.ChildNodes[0].InnerText; 342
} 343
} 344
345
return null; 346
} 347
348
/**//// <summary> 349
/// Updates a user. The username will not be changed. 350
/// </summary> 351
public override void UpdateUser(MembershipUser user) ...{ 352
XmlDocument doc = new XmlDocument(); 353
doc.Load(_XmlFileName); 354
355
foreach (XmlNode node in doc.GetElementsByTagName("User")) ...{ 356
if (node.ChildNodes[0].InnerText.Equals(user.UserName, StringComparison.OrdinalIgnoreCase)) ...{ 357
if (user.Comment.Length > 30) ...{ 358
node.ChildNodes[1].InnerText = user.Comment; 359
} 360
node.ChildNodes[2].InnerText = user.Email; 361
node.ChildNodes[3].InnerText = user.LastLoginDate.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); 362
doc.Save(_XmlFileName); 363
_Users[user.UserName] = user; 364
} 365
} 366
} 367
368
#endregion 369
370
Helper methods#region Helper methods 371
372
/**//// <summary> 373
/// Builds the internal cache of users. 374
/// </summary> 375
private void ReadMembershipDataStore() ...{ 376
lock (this) ...{ 377
if (_Users == null) ...{ 378
_Users = new Dictionary<string, MembershipUser>(16, StringComparer.OrdinalIgnoreCase); 379
XmlDocument doc = new XmlDocument(); 380
doc.Load(_XmlFileName); 381
XmlNodeList nodes = doc.GetElementsByTagName("User"); 382
383
foreach (XmlNode node in nodes) ...{ 384
MembershipUser user = new MembershipUser( 385
Name, // Provider name 386
node["UserName"].InnerText, // Username 387
node["UserName"].InnerText, // providerUserKey 388
node["Email"].InnerText, // Email 389
String.Empty, // passwordQuestion 390
node["Password"].InnerText, // Comment 391
true, // isApproved 392
false, // isLockedOut 393
DateTime.Now, // creationDate 394
DateTime.Parse(node["LastLoginTime"].InnerText, CultureInfo.InvariantCulture), // lastLoginDate 395
DateTime.Now, // lastActivityDate 396
DateTime.Now, // lastPasswordChangedDate 397
new DateTime(1980, 1, 1) // lastLockoutDate 398
); 399
400
_Users.Add(user.UserName, user); 401
} 402
} 403
} 404
} 405
406
/**////// <summary> 407
///// Encrypts a string using the SHA256 algorithm. 408
///// </summary> 409
//private static string Encrypt(string plainMessage) 410
//{ 411
// byte[] data = Encoding.UTF8.GetBytes(plainMessage); 412
// using (HashAlgorithm sha = new SHA256Managed()) 413
// { 414
// byte[] encryptedBytes = sha.TransformFinalBlock(data, 0, data.Length); 415
// return Convert.ToBase64String(sha.Hash); 416
// } 417
//} 418
419
#endregion 420
421
Unsupported methods#region Unsupported methods 422
423
/**//// <summary> 424
/// 425
/// </summary> 426
/// <param name="username"></param> 427
/// <param name="answer"></param> 428
/// <returns></returns> 429
public override string ResetPassword(string username, string answer) ...{ 430
throw new NotSupportedException(); 431
} 432
433
/**//// <summary> 434
/// 435
/// </summary> 436
/// <param name="userName"></param> 437
/// <returns></returns> 438
public override bool UnlockUser(string userName) ...{ 439
throw new NotSupportedException(); 440
} 441
442
/**//// <summary> 443
/// 444
/// </summary> 445
/// <param name="emailToMatch"></param> 446
/// <param name="pageIndex"></param> 447
/// <param name="pageSize"></param> 448
/// <param name="totalRecords"></param> 449
/// <returns></returns> 450
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) ...{ 451
throw new NotSupportedException(); 452
} 453
454
/**//// <summary> 455
/// 456
/// </summary> 457
/// <param name="usernameToMatch"></param> 458
/// <param name="pageIndex"></param> 459
/// <param name="pageSize"></param> 460
/// <param name="totalRecords"></param> 461
/// <returns></returns> 462
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) ...{ 463
throw new NotSupportedException(); 464
} 465
466
/**//// <summary> 467
/// 468
/// </summary> 469
/// <returns></returns> 470
public override int GetNumberOfUsersOnline() ...{ 471
throw new NotSupportedException(); 472
} 473
474
/**//// <summary> 475
/// 476
/// </summary> 477
/// <param name="username"></param> 478
/// <param name="password"></param> 479
/// <param name="newPasswordQuestion"></param> 480
/// <param name="newPasswordAnswer"></param> 481
/// <returns></returns> 482
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) ...{ 483
throw new NotSupportedException(); 484
} 485
486
/**//// <summary> 487
/// 488
/// </summary> 489
/// <param name="username"></param> 490
/// <param name="answer"></param> 491
/// <returns></returns> 492
public override string GetPassword(string username, string answer) ...{ 493
throw new NotSupportedException(); 494
} 495
496
#endregion 497
498
} 499
}






