Initial in memory implementation
InMemory implementation for Identity
This commit is contained in:
parent
afa12ea595
commit
06f9b90aea
14
Identity.sln
14
Identity.sln
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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(); } }
|
||||
}
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"version" : "0.1-alpha-*",
|
||||
"dependencies": {
|
||||
"Microsoft.AspNet.Identity" : "0.1-alpha-*",
|
||||
"System.Security.Claims" : "0.1-alpha-*"
|
||||
},
|
||||
"configurations": {
|
||||
"net45": {},
|
||||
"k10": {}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue