Delete old files
This commit is contained in:
parent
bc4c53f086
commit
84e140e63c
|
|
@ -1,106 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.Entity
|
|
||||||
{
|
|
||||||
public class EntityUser : EntityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
|
|
||||||
{
|
|
||||||
public EntityUser()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public EntityUser(string userName)
|
|
||||||
: this()
|
|
||||||
{
|
|
||||||
UserName = userName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EntityUser<TKey, TLogin, TRole, TClaim>
|
|
||||||
where TLogin : IdentityUserLogin<TKey>
|
|
||||||
where TRole : IdentityUserRole<TKey>
|
|
||||||
where TClaim : IdentityUserClaim<TKey>
|
|
||||||
where TKey : IEquatable<TKey>
|
|
||||||
{
|
|
||||||
public EntityUser()
|
|
||||||
{
|
|
||||||
Claims = new List<TClaim>();
|
|
||||||
Roles = new List<TRole>();
|
|
||||||
Logins = new List<TLogin>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual TKey Id { get; set; }
|
|
||||||
public virtual string UserName { get; set; }
|
|
||||||
|
|
||||||
/// <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 DateTime? 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; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Navigation property for user roles
|
|
||||||
/// </summary>
|
|
||||||
public virtual ICollection<TRole> Roles { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Navigation property for user claims
|
|
||||||
/// </summary>
|
|
||||||
public virtual ICollection<TClaim> Claims { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Navigation property for user logins
|
|
||||||
/// </summary>
|
|
||||||
public virtual ICollection<TLogin> Logins { get; private set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,883 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.Data.Entity;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.Entity
|
|
||||||
{
|
|
||||||
public class InMemoryUserStore : InMemoryUserStore<EntityUser, IdentityContext>
|
|
||||||
{
|
|
||||||
public InMemoryUserStore(IdentityContext context) : base(context) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InMemoryUserStore<TUser> : InMemoryUserStore<TUser, IdentityContext>
|
|
||||||
where TUser : EntityUser
|
|
||||||
{
|
|
||||||
public InMemoryUserStore(IdentityContext context) : base(context) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InMemoryUserStore<TUser, TContext> : InMemoryUserStore<TUser, EntityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim, TContext>
|
|
||||||
where TUser:EntityUser
|
|
||||||
where TContext : DbContext
|
|
||||||
{
|
|
||||||
public InMemoryUserStore(TContext context) : base(context) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InMemoryUserStore<TUser, TRole, TKey, TUserLogin, TUserRole, TUserClaim, TContext> :
|
|
||||||
IUserLoginStore<TUser>,
|
|
||||||
IUserClaimStore<TUser>,
|
|
||||||
IUserRoleStore<TUser>,
|
|
||||||
IUserPasswordStore<TUser>,
|
|
||||||
IUserSecurityStampStore<TUser>,
|
|
||||||
IQueryableUserStore<TUser>,
|
|
||||||
IUserEmailStore<TUser>,
|
|
||||||
IUserPhoneNumberStore<TUser>,
|
|
||||||
IUserTwoFactorStore<TUser>,
|
|
||||||
IUserLockoutStore<TUser>
|
|
||||||
where TKey : IEquatable<TKey>
|
|
||||||
where TUser : EntityUser<TKey, TUserLogin, TUserRole, TUserClaim>
|
|
||||||
where TRole : EntityRole<TKey, TUserRole>
|
|
||||||
where TUserLogin : IdentityUserLogin<TKey>, new()
|
|
||||||
where TUserRole : IdentityUserRole<TKey>, new()
|
|
||||||
where TUserClaim : IdentityUserClaim<TKey>, new()
|
|
||||||
where TContext : DbContext
|
|
||||||
{
|
|
||||||
private bool _disposed;
|
|
||||||
|
|
||||||
public InMemoryUserStore(TContext context)
|
|
||||||
{
|
|
||||||
if (context == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("context");
|
|
||||||
}
|
|
||||||
Context = context;
|
|
||||||
AutoSaveChanges = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TContext Context { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If true will call SaveChanges after CreateAsync/UpdateAsync/DeleteAsync
|
|
||||||
/// </summary>
|
|
||||||
public bool AutoSaveChanges { get; set; }
|
|
||||||
|
|
||||||
private Task SaveChanges(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
return AutoSaveChanges ? Context.SaveChangesAsync(cancellationToken) : Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual Task<TUser> GetUserAggregate(Expression<Func<TUser, bool>> filter, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(Users.SingleOrDefault(filter));
|
|
||||||
// TODO: return Users.SingleOrDefaultAsync(filter, cancellationToken);
|
|
||||||
//Include(u => u.Roles)
|
|
||||||
//.Include(u => u.Claims)
|
|
||||||
//.Include(u => u.Logins)
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetUserIdAsync(TUser user, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(Convert.ToString(user.Id, CultureInfo.InvariantCulture));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetUserNameAsync(TUser user, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.UserName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetUserNameAsync(TUser user, string userName, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.UserName = userName;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async virtual Task CreateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
await Context.AddAsync(user, cancellationToken);
|
|
||||||
await SaveChanges(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async virtual Task UpdateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
await Context.UpdateAsync(user, cancellationToken);
|
|
||||||
await SaveChanges(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async virtual Task DeleteAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
Context.Delete(user);
|
|
||||||
await SaveChanges(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual TKey ConvertUserId(string userId)
|
|
||||||
{
|
|
||||||
return (TKey)Convert.ChangeType(userId, typeof(TKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Find a user by id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="userId"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
var id = ConvertUserId(userId);
|
|
||||||
return GetUserAggregate(u => u.Id.Equals(id), cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Find a user by name
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="userName"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<TUser> FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
return GetUserAggregate(u => u.UserName.ToUpper() == userName.ToUpper(), cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IQueryable<TUser> Users
|
|
||||||
{
|
|
||||||
get { return Context.Set<TUser>(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public async virtual Task AddLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
if (login == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("login");
|
|
||||||
}
|
|
||||||
var l = new TUserLogin
|
|
||||||
{
|
|
||||||
UserId = user.Id,
|
|
||||||
ProviderKey = login.ProviderKey,
|
|
||||||
LoginProvider = login.LoginProvider
|
|
||||||
};
|
|
||||||
await Context.Set<TUserLogin>().AddAsync(l, cancellationToken);
|
|
||||||
user.Logins.Add(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual Task RemoveLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
if (login == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("login");
|
|
||||||
}
|
|
||||||
var provider = login.LoginProvider;
|
|
||||||
var key = login.ProviderKey;
|
|
||||||
var entry = user.Logins.SingleOrDefault(l => l.LoginProvider == provider && l.ProviderKey == key);
|
|
||||||
if (entry != null)
|
|
||||||
{
|
|
||||||
user.Logins.Remove(entry);
|
|
||||||
Context.Set<TUserLogin>().Remove(entry);
|
|
||||||
}
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual Task<IList<UserLoginInfo>> GetLoginsAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
IList<UserLoginInfo> result =
|
|
||||||
user.Logins.Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey)).ToList();
|
|
||||||
return Task.FromResult(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async virtual Task<TUser> FindByLoginAsync(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (login == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("login");
|
|
||||||
}
|
|
||||||
var provider = login.LoginProvider;
|
|
||||||
var key = login.ProviderKey;
|
|
||||||
// TODO: use FirstOrDefaultAsync
|
|
||||||
var userLogin =
|
|
||||||
Context.Set<TUserLogin>().FirstOrDefault(l => l.LoginProvider == provider && l.ProviderKey == key);
|
|
||||||
if (userLogin != null)
|
|
||||||
{
|
|
||||||
return await GetUserAggregate(u => u.Id.Equals(userLogin.UserId), cancellationToken);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set the password hash for a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="passwordHash"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetPasswordHashAsync(TUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.PasswordHash = passwordHash;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get the password hash for a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<string> GetPasswordHashAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.PasswordHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns true if the user has a password set
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> HasPasswordAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
return Task.FromResult(user.PasswordHash != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return the claims for a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<IList<Claim>> GetClaimsAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
IList<Claim> result = user.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList();
|
|
||||||
return Task.FromResult(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Add a claim to a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="claim"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task AddClaimAsync(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
if (claim == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("claim");
|
|
||||||
}
|
|
||||||
user.Claims.Add(new TUserClaim { UserId = user.Id, ClaimType = claim.Type, ClaimValue = claim.Value });
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Remove a claim from a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="claim"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task RemoveClaimAsync(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
if (claim == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("claim");
|
|
||||||
}
|
|
||||||
var claims =
|
|
||||||
user.Claims.Where(uc => uc.ClaimValue == claim.Value && uc.ClaimType == claim.Type).ToList();
|
|
||||||
foreach (var c in claims)
|
|
||||||
{
|
|
||||||
user.Claims.Remove(c);
|
|
||||||
}
|
|
||||||
// TODO:these claims might not exist in the dbset
|
|
||||||
//var query =
|
|
||||||
// _userClaims.Where(
|
|
||||||
// uc => uc.UserId.Equals(user.Id) && uc.ClaimValue == claim.Value && uc.ClaimType == claim.Type);
|
|
||||||
//foreach (var c in query)
|
|
||||||
//{
|
|
||||||
// _userClaims.Remove(c);
|
|
||||||
//}
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns whether the user email is confirmed
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> GetEmailConfirmedAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.EmailConfirmed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set IsConfirmed on the user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="confirmed"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetEmailConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.EmailConfirmed = confirmed;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set the user email
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="email"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetEmailAsync(TUser user, string email, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.Email = email;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get the user's email
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<string> GetEmailAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.Email);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// FindByLoginAsync a user by email
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="email"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<TUser> FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
return Task.FromResult(Users.SingleOrDefault(u => u.Email.ToUpper() == email.ToUpper()));
|
|
||||||
//return GetUserAggregate(u => u.Email.ToUpper() == email.ToUpper(), cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the DateTimeOffset that represents the end of a user's lockout, any time in the past should be considered
|
|
||||||
/// not locked out.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<DateTimeOffset> GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return
|
|
||||||
Task.FromResult(user.LockoutEnd.HasValue
|
|
||||||
? new DateTimeOffset(DateTime.SpecifyKind(user.LockoutEnd.Value, DateTimeKind.Utc))
|
|
||||||
: new DateTimeOffset());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Locks a user out until the specified end date (set to a past date, to unlock a user)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="lockoutEnd"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.LockoutEnd = lockoutEnd == DateTimeOffset.MinValue ? (DateTime?)null : lockoutEnd.UtcDateTime;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used to record when an attempt to access the user has failed
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<int> IncrementAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.AccessFailedCount++;
|
|
||||||
return Task.FromResult(user.AccessFailedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used to reset the account access count, typically after the account is successfully accessed
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task ResetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.AccessFailedCount = 0;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the current number of failed access attempts. This number usually will be reset whenever the password is
|
|
||||||
/// verified or the account is locked out.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<int> GetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.AccessFailedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns whether the user can be locked out.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> GetLockoutEnabledAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.LockoutEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets whether the user can be locked out.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="enabled"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetLockoutEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.LockoutEnabled = enabled;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set the user's phone number
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="phoneNumber"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetPhoneNumberAsync(TUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.PhoneNumber = phoneNumber;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get a user's phone number
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<string> GetPhoneNumberAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.PhoneNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns whether the user phoneNumber is confirmed
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> GetPhoneNumberConfirmedAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.PhoneNumberConfirmed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set PhoneNumberConfirmed on the user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="confirmed"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.PhoneNumberConfirmed = confirmed;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Add a user to a role
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="roleName"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task AddToRoleAsync(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
// TODO:
|
|
||||||
//if (String.IsNullOrWhiteSpace(roleName))
|
|
||||||
//{
|
|
||||||
// throw new ArgumentException(IdentityResources.ValueCannotBeNullOrEmpty, "roleName");
|
|
||||||
//}
|
|
||||||
var roleEntity = Context.Set<TRole>().SingleOrDefault(r => r.Name.ToUpper() == roleName.ToUpper());
|
|
||||||
if (roleEntity == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Role Not Found");
|
|
||||||
//TODO: String.Format(CultureInfo.CurrentCulture, IdentityResources.RoleNotFound, roleName));
|
|
||||||
}
|
|
||||||
var ur = new TUserRole { UserId = user.Id, RoleId = roleEntity.Id };
|
|
||||||
user.Roles.Add(ur);
|
|
||||||
roleEntity.Users.Add(ur);
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Remove a user from a role
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="roleName"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task RemoveFromRoleAsync(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
//if (String.IsNullOrWhiteSpace(roleName))
|
|
||||||
//{
|
|
||||||
// throw new ArgumentException(IdentityResources.ValueCannotBeNullOrEmpty, "roleName");
|
|
||||||
//}
|
|
||||||
var roleEntity = Context.Set<TRole>().SingleOrDefault(r => r.Name.ToUpper() == roleName.ToUpper());
|
|
||||||
if (roleEntity != null)
|
|
||||||
{
|
|
||||||
var userRole = user.Roles.FirstOrDefault(r => roleEntity.Id.Equals(r.RoleId));
|
|
||||||
if (userRole != null)
|
|
||||||
{
|
|
||||||
user.Roles.Remove(userRole);
|
|
||||||
roleEntity.Users.Remove(userRole);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get the names of the roles a user is a member of
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<IList<string>> GetRolesAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
var query = from userRoles in user.Roles
|
|
||||||
join roles in Context.Set<TRole>()
|
|
||||||
on userRoles.RoleId equals roles.Id
|
|
||||||
select roles.Name;
|
|
||||||
return Task.FromResult<IList<string>>(query.ToList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns true if the user is in the named role
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="roleName"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> IsInRoleAsync(TUser user, string roleName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
//if (String.IsNullOrWhiteSpace(roleName))
|
|
||||||
//{
|
|
||||||
// throw new ArgumentException(IdentityResources.ValueCannotBeNullOrEmpty, "roleName");
|
|
||||||
//}
|
|
||||||
var any =
|
|
||||||
Context.Set<TRole>().Where(r => r.Name.ToUpper() == roleName.ToUpper())
|
|
||||||
.Where(r => r.Users.Any(ur => ur.UserId.Equals(user.Id)))
|
|
||||||
.Count() > 0;
|
|
||||||
return Task.FromResult(any);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set the security stamp for the user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="stamp"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetSecurityStampAsync(TUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.SecurityStamp = stamp;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get the security stamp for a user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<string> GetSecurityStampAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.SecurityStamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set whether two factor authentication is enabled for the user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="enabled"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task SetTwoFactorEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
user.TwoFactorEnabled = enabled;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets whether two factor authentication is enabled for the user
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="user"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual Task<bool> GetTwoFactorEnabledAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
ThrowIfDisposed();
|
|
||||||
if (user == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException("user");
|
|
||||||
}
|
|
||||||
return Task.FromResult(user.TwoFactorEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ThrowIfDisposed()
|
|
||||||
{
|
|
||||||
if (_disposed)
|
|
||||||
{
|
|
||||||
throw new ObjectDisposedException(GetType().Name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dispose the store
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
_disposed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using Microsoft.AspNet.Identity.InMemory;
|
|
||||||
using Microsoft.Framework.DependencyInjection;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity
|
|
||||||
{
|
|
||||||
public static class IdentityBuilderExtensions
|
|
||||||
{
|
|
||||||
public static IdentityBuilder<TUser, TRole> AddInMemory<TUser, TRole>(this IdentityBuilder<TUser, TRole> builder)
|
|
||||||
where TUser : IdentityUser
|
|
||||||
where TRole : IdentityRole
|
|
||||||
{
|
|
||||||
builder.Services.AddSingleton<IUserStore<TUser>, InMemoryUserStore<TUser>>();
|
|
||||||
builder.Services.AddScoped<UserManager<TUser>, UserManager<TUser>>();
|
|
||||||
builder.Services.AddSingleton<IRoleStore<TRole>, InMemoryRoleStore<TRole>>();
|
|
||||||
builder.Services.AddScoped<RoleManager<TRole>, RoleManager<TRole>>();
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.InMemory
|
|
||||||
{
|
|
||||||
public class InMemoryRoleStore<TRole> : IQueryableRoleStore<TRole> where TRole : IdentityRole
|
|
||||||
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, TRole> _roles = new Dictionary<string, TRole>();
|
|
||||||
|
|
||||||
public Task CreateAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
_roles[role.Id] = role;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (role == null || !_roles.ContainsKey(role.Id))
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Unknown role");
|
|
||||||
}
|
|
||||||
_roles.Remove(role.Id);
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetRoleIdAsync(TRole role, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
return Task.FromResult(role.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetRoleNameAsync(TRole role, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
return Task.FromResult(role.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetRoleNameAsync(TRole role, string roleName, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
role.Name = roleName;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task UpdateAsync(TRole role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
_roles[role.Id] = role;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TRole> FindByIdAsync(string roleId, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (_roles.ContainsKey(roleId))
|
|
||||||
{
|
|
||||||
return Task.FromResult(_roles[roleId]);
|
|
||||||
}
|
|
||||||
return Task.FromResult<TRole>(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TRole> FindByNameAsync(string roleName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return
|
|
||||||
Task.FromResult(
|
|
||||||
Roles.SingleOrDefault(r => String.Equals(r.Name, roleName, StringComparison.OrdinalIgnoreCase)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public IQueryable<TRole> Roles
|
|
||||||
{
|
|
||||||
get { return _roles.Values.AsQueryable(); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,329 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.InMemory
|
|
||||||
{
|
|
||||||
public class InMemoryUserStore<TUser> :
|
|
||||||
IUserLoginStore<TUser>,
|
|
||||||
IUserRoleStore<TUser>,
|
|
||||||
IUserClaimStore<TUser>,
|
|
||||||
IUserPasswordStore<TUser>,
|
|
||||||
IUserSecurityStampStore<TUser>,
|
|
||||||
IUserEmailStore<TUser>,
|
|
||||||
IUserLockoutStore<TUser>,
|
|
||||||
IUserPhoneNumberStore<TUser>,
|
|
||||||
IQueryableUserStore<TUser>,
|
|
||||||
IUserTwoFactorStore<TUser>
|
|
||||||
where TUser : IdentityUser
|
|
||||||
{
|
|
||||||
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>> GetClaimsAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
var claims = user.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList();
|
|
||||||
return Task.FromResult<IList<Claim>>(claims);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task AddClaimAsync(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.Claims.Add(new IdentityUserClaim<string> { ClaimType = claim.Type, ClaimValue = claim.Value, UserId = user.Id });
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task RemoveClaimAsync(TUser user, Claim claim, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
var entity =
|
|
||||||
user.Claims.FirstOrDefault(
|
|
||||||
uc => uc.UserId == user.Id && uc.ClaimType == claim.Type && uc.ClaimValue == claim.Value);
|
|
||||||
if (entity != null)
|
|
||||||
{
|
|
||||||
user.Claims.Remove(entity);
|
|
||||||
}
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetEmailAsync(TUser user, string email, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.Email = email;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetEmailAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.Email);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> GetEmailConfirmedAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.EmailConfirmed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetEmailConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.EmailConfirmed = confirmed;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TUser> FindByEmailAsync(string email, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return
|
|
||||||
Task.FromResult(
|
|
||||||
Users.FirstOrDefault(u => String.Equals(u.Email, email, StringComparison.OrdinalIgnoreCase)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<DateTimeOffset> GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.LockoutEnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.LockoutEnd = lockoutEnd;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> IncrementAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.AccessFailedCount++;
|
|
||||||
return Task.FromResult(user.AccessFailedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task ResetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.AccessFailedCount = 0;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> GetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.AccessFailedCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> GetLockoutEnabledAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.LockoutEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetLockoutEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.LockoutEnabled = enabled;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task AddLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.Logins.Add(new IdentityUserLogin<string>
|
|
||||||
{
|
|
||||||
UserId = user.Id,
|
|
||||||
LoginProvider = login.LoginProvider,
|
|
||||||
ProviderKey = login.ProviderKey
|
|
||||||
});
|
|
||||||
_logins[login] = user;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task RemoveLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
var loginEntity =
|
|
||||||
user.Logins.SingleOrDefault(
|
|
||||||
l =>
|
|
||||||
l.ProviderKey == login.ProviderKey && l.LoginProvider == login.LoginProvider &&
|
|
||||||
l.UserId == user.Id);
|
|
||||||
if (loginEntity != null)
|
|
||||||
{
|
|
||||||
user.Logins.Remove(loginEntity);
|
|
||||||
}
|
|
||||||
_logins[login] = null;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<IList<UserLoginInfo>> GetLoginsAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
var logins = user.Logins.Select(l => new UserLoginInfo(l.LoginProvider, l.ProviderKey)).ToList();
|
|
||||||
return Task.FromResult<IList<UserLoginInfo>>(logins);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TUser> FindByLoginAsync(UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (_logins.ContainsKey(login))
|
|
||||||
{
|
|
||||||
return Task.FromResult(_logins[login]);
|
|
||||||
}
|
|
||||||
return Task.FromResult<TUser>(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetUserIdAsync(TUser user, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetUserNameAsync(TUser user, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.UserName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetUserNameAsync(TUser user, string userName, CancellationToken cancellationToken = new CancellationToken())
|
|
||||||
{
|
|
||||||
user.UserName = userName;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task CreateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
_users[user.Id] = user;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task UpdateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
_users[user.Id] = user;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (_users.ContainsKey(userId))
|
|
||||||
{
|
|
||||||
return Task.FromResult(_users[userId]);
|
|
||||||
}
|
|
||||||
return Task.FromResult<TUser>(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<TUser> FindByNameAsync(string userName, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return
|
|
||||||
Task.FromResult(
|
|
||||||
Users.FirstOrDefault(u => String.Equals(u.UserName, userName, StringComparison.OrdinalIgnoreCase)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task DeleteAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (user == null || !_users.ContainsKey(user.Id))
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Unknown user");
|
|
||||||
}
|
|
||||||
_users.Remove(user.Id);
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetPasswordHashAsync(TUser user, string passwordHash, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.PasswordHash = passwordHash;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetPasswordHashAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.PasswordHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> HasPasswordAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.PasswordHash != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetPhoneNumberAsync(TUser user, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.PhoneNumber = phoneNumber;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetPhoneNumberAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.PhoneNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> GetPhoneNumberConfirmedAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.PhoneNumberConfirmed);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.PhoneNumberConfirmed = confirmed;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoleId == roleName for InMemory
|
|
||||||
public Task AddToRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.Roles.Add(new IdentityUserRole<string> { RoleId = role, UserId = user.Id });
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoleId == roleName for InMemory
|
|
||||||
public Task RemoveFromRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
var roleEntity = user.Roles.SingleOrDefault(ur => ur.RoleId == role);
|
|
||||||
if (roleEntity != null)
|
|
||||||
{
|
|
||||||
user.Roles.Remove(roleEntity);
|
|
||||||
}
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<IList<string>> GetRolesAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult<IList<string>>(user.Roles.Select(ur => ur.RoleId).ToList());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> IsInRoleAsync(TUser user, string role, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.Roles.Any(ur => ur.RoleId == role));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetSecurityStampAsync(TUser user, string stamp, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.SecurityStamp = stamp;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<string> GetSecurityStampAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
return Task.FromResult(user.SecurityStamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task SetTwoFactorEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
user.TwoFactorEnabled = enabled;
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<bool> GetTwoFactorEnabledAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="__ToolsVersion__" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">12.0</VisualStudioVersion>
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>01a9da71-5c42-4ed5-ad0c-d6faf11c0a74</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'" Label="Configuration">
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'" Label="Configuration">
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="project.json" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="IdentityBuilderExtensions.cs" />
|
|
||||||
<Compile Include="InMemoryRoleStore.cs" />
|
|
||||||
<Compile Include="InMemoryUserStore.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
</Project>
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,103 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNet.Identity.Test;
|
|
||||||
using Microsoft.Data.Entity;
|
|
||||||
using Microsoft.Data.Entity.InMemory;
|
|
||||||
using Microsoft.Framework.DependencyInjection;
|
|
||||||
using Microsoft.Framework.DependencyInjection.Fallback;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.Entity.Test
|
|
||||||
{
|
|
||||||
public class RoleStoreTest
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public async Task CanCreateUsingAddRoleManager()
|
|
||||||
{
|
|
||||||
var services = new ServiceCollection();
|
|
||||||
services.AddEntityFramework().AddInMemoryStore();
|
|
||||||
// TODO: this should construct a new instance of InMemoryStore
|
|
||||||
var store = new EntityRoleStore<EntityRole>(new IdentityContext());
|
|
||||||
services.AddIdentity<EntityUser, EntityRole>(s =>
|
|
||||||
{
|
|
||||||
s.AddRoleStore(() => store);
|
|
||||||
});
|
|
||||||
|
|
||||||
var provider = services.BuildServiceProvider();
|
|
||||||
var manager = provider.GetService<RoleManager<EntityRole>>();
|
|
||||||
Assert.NotNull(manager);
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(new EntityRole("arole")));
|
|
||||||
}
|
|
||||||
[Fact]
|
|
||||||
public async Task CanCreateRoleWithSingletonManager()
|
|
||||||
{
|
|
||||||
var services = new ServiceCollection();
|
|
||||||
services.AddEntityFramework().AddInMemoryStore();
|
|
||||||
services.AddTransient<IdentityContext>();
|
|
||||||
services.AddTransient<IRoleStore<EntityRole>, EntityRoleStore<EntityRole>>();
|
|
||||||
services.AddTransient<IRoleValidator<EntityRole>, RoleValidator<EntityRole>>();
|
|
||||||
services.AddSingleton<RoleManager<EntityRole>>();
|
|
||||||
var provider = services.BuildServiceProvider();
|
|
||||||
var manager = provider.GetService<RoleManager<EntityRole>>();
|
|
||||||
Assert.NotNull(manager);
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(new EntityRole("someRole")));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task RoleStoreMethodsThrowWhenDisposedTest()
|
|
||||||
{
|
|
||||||
var store = new EntityRoleStore<EntityRole>(new IdentityContext());
|
|
||||||
store.Dispose();
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByIdAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.FindByNameAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.GetRoleIdAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.GetRoleNameAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.SetRoleNameAsync(null, null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.CreateAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.UpdateAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ObjectDisposedException>(async () => await store.DeleteAsync(null));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task RoleStorePublicNullCheckTest()
|
|
||||||
{
|
|
||||||
Assert.Throws<ArgumentNullException>("context", () => new EntityRoleStore<EntityRole>(null));
|
|
||||||
var store = new EntityRoleStore<EntityRole>(new IdentityContext());
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleIdAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.GetRoleNameAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.SetRoleNameAsync(null, null));
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.CreateAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.UpdateAsync(null));
|
|
||||||
await Assert.ThrowsAsync<ArgumentNullException>("role", async () => await store.DeleteAsync(null));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CanUpdateRoleName()
|
|
||||||
{
|
|
||||||
var manager = TestIdentityFactory.CreateRoleManager();
|
|
||||||
var role = new EntityRole("UpdateRoleName");
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
|
|
||||||
Assert.Null(await manager.FindByNameAsync("New"));
|
|
||||||
role.Name = "New";
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.UpdateAsync(role));
|
|
||||||
Assert.NotNull(await manager.FindByNameAsync("New"));
|
|
||||||
Assert.Null(await manager.FindByNameAsync("UpdateAsync"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CanSetUserName()
|
|
||||||
{
|
|
||||||
var manager = TestIdentityFactory.CreateRoleManager();
|
|
||||||
var role = new EntityRole("UpdateRoleName");
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(role));
|
|
||||||
Assert.Null(await manager.FindByNameAsync("New"));
|
|
||||||
IdentityResultAssert.IsSuccess(await manager.SetRoleNameAsync(role, "New"));
|
|
||||||
Assert.NotNull(await manager.FindByNameAsync("New"));
|
|
||||||
Assert.Null(await manager.FindByNameAsync("UpdateAsync"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using Microsoft.AspNet.Identity.Test;
|
|
||||||
using Microsoft.Data.Entity;
|
|
||||||
using Microsoft.Framework.DependencyInjection;
|
|
||||||
using Microsoft.Framework.DependencyInjection.Fallback;
|
|
||||||
using Microsoft.Framework.OptionsModel;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Identity.Entity.Test
|
|
||||||
{
|
|
||||||
public static class TestIdentityFactory
|
|
||||||
{
|
|
||||||
public static IdentityContext CreateContext()
|
|
||||||
{
|
|
||||||
var services = new ServiceCollection();
|
|
||||||
services.AddEntityFramework().AddInMemoryStore();
|
|
||||||
var serviceProvider = services.BuildServiceProvider();
|
|
||||||
|
|
||||||
var db = new IdentityContext(serviceProvider);
|
|
||||||
db.Database.EnsureCreated();
|
|
||||||
|
|
||||||
return db;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UserManager<EntityUser> CreateManager(IdentityContext context)
|
|
||||||
{
|
|
||||||
return MockHelpers.CreateManager<EntityUser>(() => new InMemoryUserStore<EntityUser>(context));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UserManager<EntityUser> CreateManager()
|
|
||||||
{
|
|
||||||
return CreateManager(CreateContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RoleManager<EntityRole> CreateRoleManager(IdentityContext context)
|
|
||||||
{
|
|
||||||
var services = new ServiceCollection();
|
|
||||||
services.Add(OptionsServices.GetDefaultServices());
|
|
||||||
services.AddIdentity<EntityUser, EntityRole>(b => b.AddRoleStore(() => new EntityRoleStore<EntityRole>(context)));
|
|
||||||
return services.BuildServiceProvider().GetService<RoleManager<EntityRole>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RoleManager<EntityRole> CreateRoleManager()
|
|
||||||
{
|
|
||||||
return CreateRoleManager(CreateContext());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue