Advertisement
Guest User

Untitled

a guest
Oct 8th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.75 KB | None | 0 0
  1. using BetaRill.Core.Primitives;
  2. using BetaRill.Domain.DomainModels;
  3. using BetaRill.Domain.DomainModels.Users;
  4. using BetaRill.Infrastructure;
  5. using BetaRill.Infrastructure.Repositories;
  6. using Microsoft.AspNet.Identity;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11.  
  12. namespace BetaRill.Application.Services.Identity
  13. {
  14. public class IdentityUserStore : IUserStore<IdentityUser, string>, IUserRoleStore<IdentityUser, string>,
  15. IUserClaimStore<IdentityUser, string>, IUserLoginStore<IdentityUser, string>,
  16. IUserPasswordStore<IdentityUser, string>, IUserSecurityStampStore<IdentityUser, string>, IDisposable
  17. {
  18. public EntityManager EntityManager { get; private set; }
  19.  
  20. public IdentityUserStore(EntityManager entityManager)
  21. {
  22. EntityManager = entityManager;
  23. }
  24.  
  25. public Task<IdentityUser> FindByIdAsync(string id)
  26. {
  27. var user = EntityManager.GetRepository<UserRepository>().Find(id);
  28. return Task.FromResult(GetIdentityUser(user));
  29. }
  30.  
  31. public Task<IdentityUser> FindByNameAsync(string name)
  32. {
  33. var user = EntityManager.GetRepository<UserRepository>().FindByUserName(name);
  34. return Task.FromResult(GetIdentityUser(user));
  35. }
  36.  
  37. public Task CreateAsync(IdentityUser identityUser)
  38. {
  39. CheckUser(identityUser);
  40. EntityManager.GetRepository<UserRepository>().Insert(GetUser(identityUser));
  41. return EntityManager.SaveAsync();
  42. }
  43.  
  44. public Task UpdateAsync(IdentityUser identityUser)
  45. {
  46. CheckUser(identityUser);
  47. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  48. CheckUser(user);
  49. user.UpdatePasswordHash(identityUser.Password, Guid.NewGuid().ToString());
  50. EntityManager.GetRepository<UserRepository>().Update(user);
  51. return EntityManager.SaveAsync();
  52. }
  53.  
  54. public Task DeleteAsync(IdentityUser identityUser)
  55. {
  56. CheckUser(identityUser);
  57. EntityManager.GetRepository<UserRepository>().Delete(GetUser(identityUser));
  58. return EntityManager.SaveAsync();
  59. }
  60.  
  61. public Task AddClaimAsync(IdentityUser identityUser, System.Security.Claims.Claim claim)
  62. {
  63. CheckUser(identityUser);
  64. CheckClaim(claim);
  65. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  66. CheckUser(user);
  67. var newId = EntityManager.GetRepository<ClaimRepository>().GenerateID();
  68. var newClaim = new Claim(newId, user.Id, claim.Type, claim.Value);
  69. user.Claims.Add(newClaim);
  70. EntityManager.GetRepository<UserRepository>().Update(user);
  71. return EntityManager.SaveAsync();
  72. }
  73.  
  74. public Task<IList<System.Security.Claims.Claim>> GetClaimsAsync(IdentityUser identityUser)
  75. {
  76. CheckUser(identityUser);
  77. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  78. CheckUser(user);
  79. return Task.FromResult<IList<System.Security.Claims.Claim>>(user.Claims.Select(cl => new System.Security.Claims.Claim(cl.Type,cl.Value)).ToList());
  80. }
  81.  
  82. public Task RemoveClaimAsync(IdentityUser identityUser, System.Security.Claims.Claim claim)
  83. {
  84. CheckUser(identityUser);
  85. CheckClaim(claim);
  86. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  87. CheckUser(user);
  88. var removedClaim = user.Claims.FirstOrDefault(cl => cl.Type == claim.Type && cl.Value == claim.Value);
  89. user.Claims.Remove(removedClaim);
  90. EntityManager.GetRepository<UserRepository>().Update(user);
  91. return EntityManager.SaveAsync();
  92. }
  93.  
  94. public Task AddLoginAsync(IdentityUser identityUser, UserLoginInfo userLoginInfo)
  95. {
  96. CheckUser(identityUser);
  97. CheckLogin(userLoginInfo);
  98. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  99. CheckUser(user);
  100. var newId = EntityManager.GetRepository<LoginRepository>().GenerateID();
  101. var newLogin = new Login(newId, user.Id, userLoginInfo.LoginProvider, userLoginInfo.ProviderKey, DateTime.Now);
  102. user.Logins.Add(newLogin);
  103. EntityManager.GetRepository<UserRepository>().Update(user);
  104. return EntityManager.SaveAsync();
  105. }
  106.  
  107. public Task<IdentityUser> FindAsync(UserLoginInfo userLoginInfo)
  108. {
  109. CheckLogin(userLoginInfo);
  110. var identityUser = default(IdentityUser);
  111. var login = EntityManager.GetRepository<LoginRepository>().FindByProviderAndKey(userLoginInfo.LoginProvider, userLoginInfo.ProviderKey);
  112. identityUser = (login == null) ? identityUser : GetIdentityUser(login.User);
  113. return Task.FromResult(identityUser);
  114. }
  115.  
  116. public Task<IList<UserLoginInfo>> GetLoginsAsync(IdentityUser identityUser)
  117. {
  118. CheckUser(identityUser);
  119. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  120. CheckUser(user);
  121. return Task.FromResult<IList<UserLoginInfo>>(user.Logins.Select(lg => new UserLoginInfo(lg.Provider, lg.Key)).ToList());
  122. }
  123.  
  124. public Task RemoveLoginAsync(IdentityUser identityUser, UserLoginInfo userLoginInfo)
  125. {
  126. CheckUser(identityUser);
  127. CheckLogin(userLoginInfo);
  128. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  129. CheckUser(user);
  130. var login = user.Logins.FirstOrDefault(lg => lg.Provider == userLoginInfo.LoginProvider && lg.Key == userLoginInfo.ProviderKey);
  131. user.Logins.Remove(login);
  132. EntityManager.GetRepository<UserRepository>().Update(user);
  133. return EntityManager.SaveAsync();
  134. }
  135.  
  136. public Task AddToRoleAsync(IdentityUser identityUser, string roleName)
  137. {
  138. CheckUser(identityUser);
  139. CheckRole(roleName);
  140. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  141. CheckUser(user);
  142. var role = EntityManager.GetRepository<RoleRepository>().FindByTitle(roleName);
  143. CheckRole(role);
  144. user.Roles.Add(role);
  145. EntityManager.GetRepository<UserRepository>().Update(user);
  146. return EntityManager.SaveAsync();
  147. }
  148.  
  149. public Task<IList<string>> GetRolesAsync(IdentityUser identityUser)
  150. {
  151. CheckUser(identityUser);
  152. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  153. CheckUser(user);
  154. return Task.FromResult<IList<string>>(user.Roles.Select(ro => ro.Title).ToList());
  155. }
  156.  
  157. public Task<bool> IsInRoleAsync(IdentityUser identityUser, string roleName)
  158. {
  159. CheckUser(identityUser);
  160. CheckRole(roleName);
  161. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  162. CheckUser(user);
  163. return Task.FromResult(user.Roles.Any(ro => ro.Title == roleName));
  164. }
  165.  
  166. public Task RemoveFromRoleAsync(IdentityUser identityUser, string roleName)
  167. {
  168. CheckUser(identityUser);
  169. CheckRole(roleName);
  170. var user = EntityManager.GetRepository<UserRepository>().Find(identityUser.Id);
  171. CheckUser(user);
  172. var role = user.Roles.FirstOrDefault(ro => ro.Title == roleName);
  173. user.Roles.Remove(role);
  174. EntityManager.GetRepository<UserRepository>().Update(user);
  175. return EntityManager.SaveAsync();
  176. }
  177.  
  178. public Task<string> GetPasswordHashAsync(IdentityUser identityUser)
  179. {
  180. CheckUser(identityUser);
  181. return Task.FromResult(identityUser.Password);
  182. }
  183.  
  184. public Task<bool> HasPasswordAsync(IdentityUser identityUser)
  185. {
  186. CheckUser(identityUser);
  187. return Task.FromResult(!string.IsNullOrWhiteSpace(identityUser.Password));
  188. }
  189.  
  190. public Task SetPasswordHashAsync(IdentityUser identityUser, string password)
  191. {
  192. identityUser.Password = password;
  193. return Task.FromResult(0);
  194. }
  195.  
  196. public Task<string> GetSecurityStampAsync(IdentityUser identityUser)
  197. {
  198. CheckUser(identityUser);
  199. return Task.FromResult(identityUser.SecurityStamp);
  200. }
  201.  
  202. public Task SetSecurityStampAsync(IdentityUser identityUser, string stamp)
  203. {
  204. identityUser.SecurityStamp = stamp;
  205. return Task.FromResult(0);
  206. }
  207.  
  208. private void CheckUser(IdentityUser identityUser)
  209. {
  210. (identityUser == null).IfTrue(() => { throw new ArgumentNullException("User does not exist."); });
  211. }
  212.  
  213. private void CheckUser(User user)
  214. {
  215. (user == null).IfTrue(() => { throw new ArgumentException("Identity User does not correspond to user entity."); });
  216. }
  217.  
  218. private void CheckClaim(System.Security.Claims.Claim claim)
  219. {
  220. (claim == null).IfTrue(() => { throw new ArgumentNullException("Claim does not exist."); });
  221. }
  222.  
  223. private void CheckLogin(UserLoginInfo userLoginInfo)
  224. {
  225. (userLoginInfo == null).IfTrue(() => { throw new ArgumentNullException("Login info does not exist."); });
  226. }
  227.  
  228. private void CheckRole(Role role)
  229. {
  230. (role == null).IfTrue(() => { throw new ArgumentException("The provided role name does not correspond to a role entity."); });
  231. }
  232.  
  233. private void CheckRole(string roleName)
  234. {
  235. string.IsNullOrWhiteSpace(roleName).IfTrue(() => { throw new ArgumentNullException("Role Name cannot be null or empty."); });
  236. }
  237.  
  238. private User GetUser(IdentityUser identityUser)
  239. {
  240. return (identityUser == null) ? null : CreateUser(identityUser);
  241. }
  242.  
  243. private User CreateUser(IdentityUser identityUser)
  244. {
  245. var credential = new Credential(identityUser.Email, identityUser.UserName, identityUser.Password, identityUser.SecurityStamp);
  246. var session = new Session(identityUser.SessionId, identityUser.Ip, identityUser.LoginAttempt, DateTime.Now);
  247. var meta = new UserMeta(DateTime.Now, DateTime.Now, UserStatus.Active);
  248. return new User(identityUser.Id, credential, session, meta);
  249. }
  250.  
  251. private IdentityUser CreateIdentityUser(User user)
  252. {
  253. var identityUser = new IdentityUser();
  254. MapIdentityUser(user, identityUser);
  255. return identityUser;
  256. }
  257.  
  258. private IdentityUser GetIdentityUser(User user)
  259. {
  260. return (user == null) ? null : CreateIdentityUser(user);
  261. }
  262.  
  263. private void MapIdentityUser(User user, IdentityUser identityUser)
  264. {
  265. identityUser.Id = user.Id;
  266. identityUser.Email = user.Credential.Email;
  267. identityUser.UserName = user.Credential.UserName;
  268. identityUser.Password = user.Credential.Password;
  269. identityUser.SecurityStamp = user.Credential.SecurityStamp;
  270. identityUser.SessionId = user.Session.SessionID;
  271. identityUser.Ip = user.Session.IP;
  272. identityUser.LoginAttempt = user.Session.LoginAttempt;
  273. }
  274.  
  275. public void Dispose() { }
  276. }
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement