PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Gradebook.Security/Providers/MembershipProvider.cs

https://bitbucket.org/academium/gradebook
C# | 324 lines | 281 code | 41 blank | 2 comment | 31 complexity | 4734d935a79b75755f41df34d5cd80ca MD5 | raw file
  1. using Gradebook.Contracts.Repositories;
  2. using Gradebook.Contracts.Security;
  3. using Gradebook.Model;
  4. using System;
  5. using System.Collections.Specialized;
  6. using System.Linq;
  7. using System.Web.Security;
  8. namespace Gradebook.Security.Providers
  9. {
  10. public class AccountMembershipProvider : MembershipProvider, IAccountProvider
  11. {
  12. public const string ProviderName = "AccountMembershipProvider";
  13. private IAccountRepository _repository;
  14. private IAccountRepository AccountRepository
  15. {
  16. get { return _repository ?? ProvidersHelper.GetAccountRepository(); }
  17. set { _repository = value; }
  18. }
  19. public AccountMembershipProvider() { }
  20. public AccountMembershipProvider(IAccountRepository repository)
  21. {
  22. AccountRepository = repository;
  23. }
  24. public override void Initialize(string name, NameValueCollection config)
  25. {
  26. if (config == null)
  27. {
  28. throw new ArgumentNullException("config");
  29. }
  30. if (string.IsNullOrEmpty(name))
  31. {
  32. name = ProviderName;
  33. }
  34. if (string.IsNullOrEmpty(config["description"]))
  35. {
  36. config.Remove("description");
  37. config.Add("description", "Extended Membership Provider");
  38. }
  39. base.Initialize(name, config);
  40. ApplicationName = config["applicationName"];
  41. if (string.IsNullOrEmpty(config["passwordStrengthRegularExpression"]))
  42. {
  43. _passwordStrengthRegularExpression = config["passwordStrengthRegularExpression"];
  44. }
  45. if (string.IsNullOrEmpty(config["enablePasswordReset"]))
  46. {
  47. _enablePasswordReset = Convert.ToBoolean(config["enablePasswordReset"]);
  48. }
  49. if (string.IsNullOrEmpty(config["enablePasswordRetrieval"]))
  50. {
  51. _enablePasswordRetrieval = Convert.ToBoolean(config["enablePasswordRetrieval"]);
  52. }
  53. if (string.IsNullOrEmpty(config["requiresQuetionAndAnswer"]))
  54. {
  55. _requiresQuetionAndAnswer = Convert.ToBoolean(config["requiresQuetionAndAnswer"]);
  56. }
  57. if (string.IsNullOrEmpty(config["requiresUniqueEmail"]))
  58. {
  59. _requiresUniqueEmail = Convert.ToBoolean(config["requiresUniqueEmail"]);
  60. }
  61. if (string.IsNullOrEmpty(config["maxInvalidPasswordAttempts"]))
  62. {
  63. _maxInvalidPasswordAttempts = Convert.ToInt32(config["maxInvalidPasswordAttempts"]);
  64. }
  65. if (string.IsNullOrEmpty(config["passwordAttemptWindow"]))
  66. {
  67. _passwordAttemptWindow = Convert.ToInt32(config["passwordAttemptWindow"]);
  68. }
  69. if (string.IsNullOrEmpty(config["minRequiredPasswordLength"]))
  70. {
  71. _minRequiredPasswordLength = Convert.ToInt32(config["minRequiredPasswordLength"]);
  72. }
  73. if (string.IsNullOrEmpty(config["minRequiredNonalphanumericCharacters"]))
  74. {
  75. _minRequiredNonalphanumericCharacters = Convert.ToInt32(config["minRequiredNonalphanumericCharacters"]);
  76. }
  77. if (string.IsNullOrEmpty(config["passwordFormat"]))
  78. {
  79. Enum.TryParse(config["passwordFormat"], true, out _passwordFormat);
  80. }
  81. }
  82. #region "Default config values"
  83. private string _passwordStrengthRegularExpression = "";
  84. private bool _enablePasswordReset = true;
  85. private bool _enablePasswordRetrieval = false;
  86. private bool _requiresQuetionAndAnswer = false;
  87. private bool _requiresUniqueEmail = true;
  88. private int _maxInvalidPasswordAttempts = 5;
  89. private int _passwordAttemptWindow = 10;
  90. private int _minRequiredPasswordLength = 6;
  91. private int _minRequiredNonalphanumericCharacters = 1;
  92. private MembershipPasswordFormat _passwordFormat = MembershipPasswordFormat.Hashed;
  93. #endregion
  94. #region "Properties"
  95. public override string ApplicationName { get; set; }
  96. public override string PasswordStrengthRegularExpression
  97. {
  98. get { return _passwordStrengthRegularExpression; }
  99. }
  100. public override bool EnablePasswordReset
  101. {
  102. get { return _enablePasswordReset; }
  103. }
  104. public override bool EnablePasswordRetrieval
  105. {
  106. get { return _enablePasswordRetrieval; }
  107. }
  108. public override bool RequiresQuestionAndAnswer
  109. {
  110. get { return _requiresQuetionAndAnswer; }
  111. }
  112. public override bool RequiresUniqueEmail
  113. {
  114. get { return _requiresUniqueEmail; }
  115. }
  116. public override int MaxInvalidPasswordAttempts
  117. {
  118. get { return _maxInvalidPasswordAttempts; }
  119. }
  120. public override int MinRequiredNonAlphanumericCharacters
  121. {
  122. get { return _minRequiredNonalphanumericCharacters; }
  123. }
  124. public override int MinRequiredPasswordLength
  125. {
  126. get { return _minRequiredPasswordLength; }
  127. }
  128. public override int PasswordAttemptWindow
  129. {
  130. get { return _passwordAttemptWindow; }
  131. }
  132. public override MembershipPasswordFormat PasswordFormat
  133. {
  134. get { return _passwordFormat; }
  135. }
  136. #endregion
  137. #region "Main Functions"
  138. public override MembershipUser CreateUser(
  139. string username,
  140. string password,
  141. string email,
  142. string passwordQuestion,
  143. string passwordAnswer,
  144. bool isApproved,
  145. object providerUserKey,
  146. out MembershipCreateStatus status)
  147. {
  148. var args = new ValidatePasswordEventArgs(username, password, true);
  149. OnValidatingPassword(args);
  150. if (args.Cancel)
  151. {
  152. status = MembershipCreateStatus.InvalidPassword;
  153. return null;
  154. }
  155. if (RequiresUniqueEmail && !string.IsNullOrEmpty(GetUserNameByEmail(email)))
  156. {
  157. status = MembershipCreateStatus.DuplicateEmail;
  158. return null;
  159. }
  160. var user = GetUser(username, false);
  161. if (user == null)
  162. {
  163. //var hashedPassword = Cryptography.HashPassword(password);
  164. AccountRepository.Create(username, password, email);
  165. AccountRepository.Commit();
  166. status = MembershipCreateStatus.Success;
  167. return GetUser(username, false);
  168. }
  169. status = MembershipCreateStatus.DuplicateUserName;
  170. return null;
  171. }
  172. public override MembershipUser GetUser(string username, bool userIsOnline)
  173. {
  174. if (!AccountRepository.Contains(username)) return null;
  175. var user = AccountRepository.GetUserByName(username);
  176. return new MembershipUser(
  177. ProviderName,
  178. user.Name,
  179. user.Id,
  180. user.Email,
  181. null, // user.PasswordQuestion
  182. null, // user.Comment
  183. true, // user.IsApproved
  184. false, // user.isLockedOut
  185. DateTime.Now, // user.CreationDate
  186. DateTime.Now, // user.LastLoginDate
  187. DateTime.Now, // user.LastActivityDate
  188. DateTime.Now, // user.PasswordChangedDate
  189. DateTime.MinValue // user.LastLockedOutDate
  190. );
  191. }
  192. public User CurrentUser
  193. {
  194. get
  195. {
  196. var user = Membership.GetUser();
  197. if (user != null)
  198. {
  199. if (user.ProviderUserKey != null)
  200. {
  201. var id = (int)user.ProviderUserKey;
  202. return AccountRepository.Read(id);
  203. }
  204. }
  205. return null;
  206. }
  207. }
  208. public override string GetUserNameByEmail(string email)
  209. {
  210. var user = AccountRepository.Get(x => x.Email == email).FirstOrDefault();
  211. return (user != null) ? user.Name : string.Empty;
  212. }
  213. public override void UpdateUser(MembershipUser user)
  214. {
  215. AccountRepository.Update(new User
  216. {
  217. Name = user.UserName,
  218. Email = user.Email
  219. });
  220. AccountRepository.Commit();
  221. }
  222. public override bool ValidateUser(string username, string password)
  223. {
  224. var user = AccountRepository.GetUserByName(username);
  225. //return user != null && Cryptography.VerifyHashedPassword(user.Password, password);
  226. return user != null && user.Password == password;
  227. }
  228. public override bool DeleteUser(string username, bool deleteAllRelatedData)
  229. {
  230. var user = AccountRepository.GetUserByName(username);
  231. if (user != null)
  232. {
  233. AccountRepository.Delete(user);
  234. AccountRepository.Commit();
  235. return true;
  236. }
  237. return false;
  238. }
  239. #endregion
  240. #region Not implemented
  241. public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
  242. {
  243. throw new NotImplementedException();
  244. }
  245. public override string GetPassword(string username, string answer)
  246. {
  247. throw new NotImplementedException();
  248. }
  249. public override bool ChangePassword(string username, string oldPassword, string newPassword)
  250. {
  251. throw new NotImplementedException();
  252. }
  253. public override string ResetPassword(string username, string answer)
  254. {
  255. throw new NotImplementedException();
  256. }
  257. public override bool UnlockUser(string userName)
  258. {
  259. throw new NotImplementedException();
  260. }
  261. public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
  262. {
  263. throw new NotImplementedException();
  264. }
  265. public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
  266. {
  267. throw new NotImplementedException();
  268. }
  269. public override int GetNumberOfUsersOnline()
  270. {
  271. throw new NotImplementedException();
  272. }
  273. public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
  274. {
  275. throw new NotImplementedException();
  276. }
  277. public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
  278. {
  279. throw new NotImplementedException();
  280. }
  281. #endregion
  282. }
  283. }