Initial in memory implementation

InMemory implementation for Identity
This commit is contained in:
Hao Kung 2014-03-03 13:59:23 -08:00
parent afa12ea595
commit 06f9b90aea
6 changed files with 470 additions and 0 deletions

View File

@ -19,6 +19,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.E
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.Entity.k10", "src\Microsoft.AspNet.Identity.Entity\Microsoft.AspNet.Identity.Entity.k10.csproj", "{D32483A4-B617-480C-81E6-49CD596B9A34}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.InMemory.net45", "src\Microsoft.AspNet.Identity.InMemory\Microsoft.AspNet.Identity.InMemory.net45.csproj", "{054B3FFA-7196-466F-9A8A-593FFE037A69}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Identity.InMemory.k10", "src\Microsoft.AspNet.Identity.InMemory\Microsoft.AspNet.Identity.InMemory.k10.csproj", "{D2E7A146-C39F-4302-8EA3-BFA8C1082939}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -41,6 +45,14 @@ Global
{D32483A4-B617-480C-81E6-49CD596B9A34}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D32483A4-B617-480C-81E6-49CD596B9A34}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D32483A4-B617-480C-81E6-49CD596B9A34}.Release|Any CPU.Build.0 = Release|Any CPU
{054B3FFA-7196-466F-9A8A-593FFE037A69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{054B3FFA-7196-466F-9A8A-593FFE037A69}.Debug|Any CPU.Build.0 = Debug|Any CPU
{054B3FFA-7196-466F-9A8A-593FFE037A69}.Release|Any CPU.ActiveCfg = Release|Any CPU
{054B3FFA-7196-466F-9A8A-593FFE037A69}.Release|Any CPU.Build.0 = Release|Any CPU
{D2E7A146-C39F-4302-8EA3-BFA8C1082939}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D2E7A146-C39F-4302-8EA3-BFA8C1082939}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D2E7A146-C39F-4302-8EA3-BFA8C1082939}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D2E7A146-C39F-4302-8EA3-BFA8C1082939}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -50,7 +62,9 @@ Global
{77CEDA6C-A833-455D-8357-649BFD944724} = {0F647068-6602-4E24-B1DC-8ED91481A50A}
{B72401D7-47F6-4A98-89D5-CCBFEFC5B2B8} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{E52361C9-1F0B-4229-86A0-E5C7C12A5429} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{054B3FFA-7196-466F-9A8A-593FFE037A69} = {F6B0C0E9-C346-49D0-B583-95B6CE04BB1B}
{6211450F-FFB8-431F-84E2-9A7620875260} = {77CEDA6C-A833-455D-8357-649BFD944724}
{D32483A4-B617-480C-81E6-49CD596B9A34} = {77CEDA6C-A833-455D-8357-649BFD944724}
{D2E7A146-C39F-4302-8EA3-BFA8C1082939} = {77CEDA6C-A833-455D-8357-649BFD944724}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Identity;
namespace Microsoft.AspNet.Identity.InMemory
{
public class InMemoryRole : IRole<string>
{
public InMemoryRole(string roleName)
{
Id = Guid.NewGuid().ToString();
Name = roleName;
}
public virtual string Id { get; set; }
public virtual string Name { get; set; }
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.AspNet.Identity.InMemory
{
public class InMemoryRoleStore : IQueryableRoleStore<InMemoryRole, string>
{
private readonly Dictionary<string, InMemoryRole> _roles = new Dictionary<string, InMemoryRole>();
public Task Create(InMemoryRole role)
{
_roles[role.Id] = role;
return Task.FromResult(0);
}
public Task Delete(InMemoryRole role)
{
if (role == null || !_roles.ContainsKey(role.Id))
{
throw new InvalidOperationException("Unknown role");
}
_roles.Remove(role.Id);
return Task.FromResult(0);
}
public Task Update(InMemoryRole role)
{
_roles[role.Id] = role;
return Task.FromResult(0);
}
public Task<InMemoryRole> FindById(string roleId)
{
if (_roles.ContainsKey(roleId))
{
return Task.FromResult(_roles[roleId]);
}
return Task.FromResult<InMemoryRole>(null);
}
public Task<InMemoryRole> FindByName(string roleName)
{
return Task.FromResult(Roles.SingleOrDefault(r => String.Equals(r.Name, roleName, StringComparison.OrdinalIgnoreCase)));
}
public void Dispose()
{
}
public IQueryable<InMemoryRole> Roles { get { return _roles.Values.AsQueryable(); } }
}
}

View File

@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
#if NET45
using System.Security.Claims;
#else
using System.Security.ClaimsK;
#endif
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
namespace Microsoft.AspNet.Identity.InMemory
{
public class InMemoryUser : IUser<string>
{
private readonly IList<Claim> _claims;
private readonly IList<UserLoginInfo> _logins;
private readonly IList<string> _roles;
public InMemoryUser(string name)
{
Id = Guid.NewGuid().ToString();
_logins = new List<UserLoginInfo>();
_claims = new List<Claim>();
_roles = new List<string>();
UserName = name;
}
/// <summary>
/// Email
/// </summary>
public virtual string Email { get; set; }
/// <summary>
/// True if the email is confirmed, default is false
/// </summary>
public virtual bool EmailConfirmed { get; set; }
/// <summary>
/// The salted/hashed form of the user password
/// </summary>
public virtual string PasswordHash { get; set; }
/// <summary>
/// A random value that should change whenever a users credentials have changed (password changed, login removed)
/// </summary>
public virtual string SecurityStamp { get; set; }
/// <summary>
/// PhoneNumber for the user
/// </summary>
public virtual string PhoneNumber { get; set; }
/// <summary>
/// True if the phone number is confirmed, default is false
/// </summary>
public virtual bool PhoneNumberConfirmed { get; set; }
/// <summary>
/// Is two factor enabled for the user
/// </summary>
public virtual bool TwoFactorEnabled { get; set; }
/// <summary>
/// DateTime in UTC when lockout ends, any time in the past is considered not locked out.
/// </summary>
public virtual DateTimeOffset LockoutEnd { get; set; }
/// <summary>
/// Is lockout enabled for this user
/// </summary>
public virtual bool LockoutEnabled { get; set; }
/// <summary>
/// Used to record failures for the purposes of lockout
/// </summary>
public virtual int AccessFailedCount { get; set; }
public IList<UserLoginInfo> Logins
{
get { return _logins; }
}
public IList<Claim> Claims
{
get { return _claims; }
}
public IList<string> Roles
{
get { return _roles; }
}
public virtual string Id { get; set; }
public virtual string UserName { get; set; }
}
}

View File

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

View File

@ -0,0 +1,11 @@
{
"version" : "0.1-alpha-*",
"dependencies": {
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
"System.Security.Claims" : "0.1-alpha-*"
},
"configurations": {
"net45": {},
"k10": {}
}
}