aspnetcore/src/Microsoft.AspNet.Identity.I.../InMemoryUserStore.cs

288 lines
8.0 KiB
C#

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<TUser> :
IUserLoginStore<TUser, string>,
IUserRoleStore<TUser, string>,
IUserClaimStore<TUser, string>,
IUserPasswordStore<TUser, string>,
IUserSecurityStampStore<TUser, string>,
IUserEmailStore<TUser, string>,
IUserLockoutStore<TUser, string>,
IUserPhoneNumberStore<TUser, string>,
IQueryableUserStore<TUser, string>,
IUserTwoFactorStore<TUser, string>
where TUser : InMemoryUser
{
private readonly Dictionary<UserLoginInfo, TUser> _logins =
new Dictionary<UserLoginInfo, TUser>(new LoginComparer());
private readonly Dictionary<string, TUser> _users = new Dictionary<string, TUser>();
public IQueryable<TUser> Users
{
get { return _users.Values.AsQueryable(); }
}
public Task<IList<Claim>> 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<string> GetEmail(TUser user)
{
return Task.FromResult(user.Email);
}
public Task<bool> GetEmailConfirmed(TUser user)
{
return Task.FromResult(user.EmailConfirmed);
}
public Task SetEmailConfirmed(TUser user, bool confirmed)
{
user.EmailConfirmed = confirmed;
return Task.FromResult(0);
}
public Task<TUser> FindByEmail(string email)
{
return
Task.FromResult(
Users.FirstOrDefault(u => String.Equals(u.Email, email, StringComparison.OrdinalIgnoreCase)));
}
public Task<DateTimeOffset> GetLockoutEndDate(TUser user)
{
return Task.FromResult(user.LockoutEnd);
}
public Task SetLockoutEndDate(TUser user, DateTimeOffset lockoutEnd)
{
user.LockoutEnd = lockoutEnd;
return Task.FromResult(0);
}
public Task<int> IncrementAccessFailedCount(TUser user)
{
user.AccessFailedCount++;
return Task.FromResult(user.AccessFailedCount);
}
public Task ResetAccessFailedCount(TUser user)
{
user.AccessFailedCount = 0;
return Task.FromResult(0);
}
public Task<int> GetAccessFailedCount(TUser user)
{
return Task.FromResult(user.AccessFailedCount);
}
public Task<bool> 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<IList<UserLoginInfo>> GetLogins(TUser user)
{
return Task.FromResult(user.Logins);
}
public Task<TUser> Find(UserLoginInfo login)
{
if (_logins.ContainsKey(login))
{
return Task.FromResult(_logins[login]);
}
return Task.FromResult<TUser>(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<TUser> FindById(string userId)
{
if (_users.ContainsKey(userId))
{
return Task.FromResult(_users[userId]);
}
return Task.FromResult<TUser>(null);
}
public void Dispose()
{
}
public Task<TUser> 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<string> GetPasswordHash(TUser user)
{
return Task.FromResult(user.PasswordHash);
}
public Task<bool> 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<string> GetPhoneNumber(TUser user)
{
return Task.FromResult(user.PhoneNumber);
}
public Task<bool> 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<IList<string>> GetRoles(TUser user)
{
return Task.FromResult(user.Roles);
}
public Task<bool> 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<string> GetSecurityStamp(TUser user)
{
return Task.FromResult(user.SecurityStamp);
}
public Task SetTwoFactorEnabled(TUser user, bool enabled)
{
user.TwoFactorEnabled = enabled;
return Task.FromResult(0);
}
public Task<bool> GetTwoFactorEnabled(TUser user)
{
return Task.FromResult(user.TwoFactorEnabled);
}
private class LoginComparer : IEqualityComparer<UserLoginInfo>
{
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();
}
}
}
}