using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; namespace Microsoft.AspNet.Identity.InMemory { public class InMemoryUserStore : IUserLoginStore, IUserRoleStore, IUserClaimStore, IUserPasswordStore, IUserSecurityStampStore, IUserEmailStore, IUserLockoutStore, IUserPhoneNumberStore, IQueryableUserStore, IUserTwoFactorStore where TUser : InMemoryUser { private readonly Dictionary _logins = new Dictionary(new LoginComparer()); private readonly Dictionary _users = new Dictionary(); public IQueryable Users { get { return _users.Values.AsQueryable(); } } public Task> GetClaims(TUser user) { return Task.FromResult(user.Claims); } public Task AddClaim(TUser user, Claim claim) { user.Claims.Add(claim); return Task.FromResult(0); } public Task RemoveClaim(TUser user, Claim claim) { user.Claims.Remove(claim); return Task.FromResult(0); } public Task SetEmail(TUser user, string email) { user.Email = email; return Task.FromResult(0); } public Task GetEmail(TUser user) { return Task.FromResult(user.Email); } public Task GetEmailConfirmed(TUser user) { return Task.FromResult(user.EmailConfirmed); } public Task SetEmailConfirmed(TUser user, bool confirmed) { user.EmailConfirmed = confirmed; return Task.FromResult(0); } public Task FindByEmail(string email) { return Task.FromResult( Users.FirstOrDefault(u => String.Equals(u.Email, email, StringComparison.OrdinalIgnoreCase))); } public Task GetLockoutEndDate(TUser user) { return Task.FromResult(user.LockoutEnd); } public Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd) { user.LockoutEnd = lockoutEnd; return Task.FromResult(0); } public Task IncrementAccessFailedCount(TUser user) { user.AccessFailedCount++; return Task.FromResult(user.AccessFailedCount); } public Task ResetAccessFailedCount(TUser user) { user.AccessFailedCount = 0; return Task.FromResult(0); } public Task GetAccessFailedCount(TUser user) { return Task.FromResult(user.AccessFailedCount); } public Task GetLockoutEnabled(TUser user) { return Task.FromResult(user.LockoutEnabled); } public Task SetLockoutEnabled(TUser user, bool enabled) { user.LockoutEnabled = enabled; return Task.FromResult(0); } public Task AddLogin(TUser user, UserLoginInfo login) { user.Logins.Add(login); _logins[login] = user; return Task.FromResult(0); } public Task RemoveLogin(TUser user, UserLoginInfo login) { var logs = user.Logins.Where(l => l.ProviderKey == login.ProviderKey && l.LoginProvider == login.LoginProvider) .ToList(); foreach (var l in logs) { user.Logins.Remove(l); _logins[l] = null; } return Task.FromResult(0); } public Task> GetLogins(TUser user) { return Task.FromResult(user.Logins); } public Task Find(UserLoginInfo login) { if (_logins.ContainsKey(login)) { return Task.FromResult(_logins[login]); } return Task.FromResult(null); } public Task Create(TUser user) { _users[user.Id] = user; return Task.FromResult(0); } public Task Update(TUser user) { _users[user.Id] = user; return Task.FromResult(0); } public Task FindById(string userId) { if (_users.ContainsKey(userId)) { return Task.FromResult(_users[userId]); } return Task.FromResult(null); } public void Dispose() { } public Task FindByName(string userName) { return Task.FromResult( Users.FirstOrDefault(u => String.Equals(u.UserName, userName, StringComparison.OrdinalIgnoreCase))); } public Task Delete(TUser user) { if (user == null || !_users.ContainsKey(user.Id)) { throw new InvalidOperationException("Unknown user"); } _users.Remove(user.Id); return Task.FromResult(0); } public Task SetPasswordHash(TUser user, string passwordHash) { user.PasswordHash = passwordHash; return Task.FromResult(0); } public Task GetPasswordHash(TUser user) { return Task.FromResult(user.PasswordHash); } public Task HasPassword(TUser user) { return Task.FromResult(user.PasswordHash != null); } public Task SetPhoneNumber(TUser user, string phoneNumber) { user.PhoneNumber = phoneNumber; return Task.FromResult(0); } public Task GetPhoneNumber(TUser user) { return Task.FromResult(user.PhoneNumber); } public Task GetPhoneNumberConfirmed(TUser user) { return Task.FromResult(user.PhoneNumberConfirmed); } public Task SetPhoneNumberConfirmed(TUser user, bool confirmed) { user.PhoneNumberConfirmed = confirmed; return Task.FromResult(0); } public Task AddToRole(TUser user, string role) { user.Roles.Add(role); return Task.FromResult(0); } public Task RemoveFromRole(TUser user, string role) { user.Roles.Remove(role); return Task.FromResult(0); } public Task> GetRoles(TUser user) { return Task.FromResult(user.Roles); } public Task IsInRole(TUser user, string role) { return Task.FromResult(user.Roles.Contains(role)); } public Task SetSecurityStamp(TUser user, string stamp) { user.SecurityStamp = stamp; return Task.FromResult(0); } public Task GetSecurityStamp(TUser user) { return Task.FromResult(user.SecurityStamp); } public Task SetTwoFactorEnabled(TUser user, bool enabled) { user.TwoFactorEnabled = enabled; return Task.FromResult(0); } public Task GetTwoFactorEnabled(TUser user) { return Task.FromResult(user.TwoFactorEnabled); } private class LoginComparer : IEqualityComparer { public bool Equals(UserLoginInfo x, UserLoginInfo y) { return x.LoginProvider == y.LoginProvider && x.ProviderKey == y.ProviderKey; } public int GetHashCode(UserLoginInfo obj) { return (obj.ProviderKey + "--" + obj.LoginProvider).GetHashCode(); } } } }