diff --git a/src/Microsoft.AspNet.Identity.Entity/IdentityRole.cs b/src/Microsoft.AspNet.Identity.Entity/IdentityRole.cs index b4dcdf61aa..343f3b1877 100644 --- a/src/Microsoft.AspNet.Identity.Entity/IdentityRole.cs +++ b/src/Microsoft.AspNet.Identity.Entity/IdentityRole.cs @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Identity.Entity /// /// /// - public class IdentityRole : IRole + public class IdentityRole where TUserRole : IdentityUserRole where TKey : IEquatable { diff --git a/src/Microsoft.AspNet.Identity.Entity/IdentityUser.cs b/src/Microsoft.AspNet.Identity.Entity/IdentityUser.cs index a718931db6..c0c94ef814 100644 --- a/src/Microsoft.AspNet.Identity.Entity/IdentityUser.cs +++ b/src/Microsoft.AspNet.Identity.Entity/IdentityUser.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Identity.Entity } } - public class IdentityUser : IUser + public class IdentityUser where TLogin : IdentityUserLogin where TRole : IdentityUserRole where TClaim : IdentityUserClaim diff --git a/src/Microsoft.AspNet.Identity.Entity/RoleStore.cs b/src/Microsoft.AspNet.Identity.Entity/RoleStore.cs index bee18805b6..4813aebf66 100644 --- a/src/Microsoft.AspNet.Identity.Entity/RoleStore.cs +++ b/src/Microsoft.AspNet.Identity.Entity/RoleStore.cs @@ -8,8 +8,8 @@ using Microsoft.Data.Entity; namespace Microsoft.AspNet.Identity.Entity { public class RoleStore : - IQueryableRoleStore - where TRole : class,IRole + IQueryableRoleStore + where TRole : IdentityRole where TKey : IEquatable { private bool _disposed; @@ -80,17 +80,34 @@ namespace Microsoft.AspNet.Identity.Entity await SaveChanges(cancellationToken); } + public Task GetRoleId(TRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(role.Id); + } + + public Task GetRoleName(TRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(role.Name); + } + + + public virtual TKey ConvertId(string userId) + { + return (TKey)Convert.ChangeType(userId, typeof(TKey)); + } + /// /// Find a role by id /// /// /// /// - public virtual Task FindById(TKey id, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task FindById(string id, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return Roles.SingleOrDefaultAsync(r => r.Id.Equals(id), cancellationToken); + var roleId = ConvertId(id); + return Roles.SingleOrDefaultAsync(r => r.Id.Equals(roleId), cancellationToken); //return GetRoleAggregate(u => u.Id.Equals(id)); } diff --git a/src/Microsoft.AspNet.Identity.Entity/UserStore.cs b/src/Microsoft.AspNet.Identity.Entity/UserStore.cs index e87c4bdf08..217074c2b8 100644 --- a/src/Microsoft.AspNet.Identity.Entity/UserStore.cs +++ b/src/Microsoft.AspNet.Identity.Entity/UserStore.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Linq.Expressions; using System.Security.Claims; @@ -16,16 +17,16 @@ namespace Microsoft.AspNet.Identity.Entity } public class UserStore : - IUserLoginStore, - IUserClaimStore, - IUserRoleStore, - IUserPasswordStore, - IUserSecurityStampStore, - IQueryableUserStore, - IUserEmailStore, - IUserPhoneNumberStore, - IUserTwoFactorStore, - IUserLockoutStore + IUserLoginStore, + IUserClaimStore, + IUserRoleStore, + IUserPasswordStore, + IUserSecurityStampStore, + IQueryableUserStore, + IUserEmailStore, + IUserPhoneNumberStore, + IUserTwoFactorStore, + IUserLockoutStore where TKey : IEquatable where TUser : IdentityUser where TRole : IdentityRole @@ -65,6 +66,16 @@ namespace Microsoft.AspNet.Identity.Entity //.Include(u => u.Logins) } + public Task GetUserId(TUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(Convert.ToString(user.Id, CultureInfo.InvariantCulture)); + } + + public Task GetUserName(TUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(user.UserName); + } + public async virtual Task Create(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); @@ -101,17 +112,23 @@ namespace Microsoft.AspNet.Identity.Entity await SaveChanges(cancellationToken); } + public virtual TKey ConvertUserId(string userId) + { + return (TKey)Convert.ChangeType(userId, typeof(TKey)); + } + /// /// Find a user by id /// /// /// /// - public virtual Task FindById(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task FindById(string userId, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); - return Users.SingleOrDefaultAsync(u => u.Id.Equals(userId), cancellationToken); + var id = ConvertUserId(userId); + return Users.SingleOrDefaultAsync(u => u.Id.Equals(id), cancellationToken); // TODO: return GetUserAggregate(u => u.Id.Equals(userId), cancellationToken); } diff --git a/src/Microsoft.AspNet.Identity.InMemory/InMemoryRole.cs b/src/Microsoft.AspNet.Identity.InMemory/InMemoryRole.cs index a4efda043e..524df35610 100644 --- a/src/Microsoft.AspNet.Identity.InMemory/InMemoryRole.cs +++ b/src/Microsoft.AspNet.Identity.InMemory/InMemoryRole.cs @@ -2,7 +2,7 @@ using System; namespace Microsoft.AspNet.Identity.InMemory { - public class InMemoryRole : IRole + public class InMemoryRole { public InMemoryRole(string roleName) { diff --git a/src/Microsoft.AspNet.Identity.InMemory/InMemoryRoleStore.cs b/src/Microsoft.AspNet.Identity.InMemory/InMemoryRoleStore.cs index 665d2a4b09..0ff53eb7f9 100644 --- a/src/Microsoft.AspNet.Identity.InMemory/InMemoryRoleStore.cs +++ b/src/Microsoft.AspNet.Identity.InMemory/InMemoryRoleStore.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Identity.InMemory { - public class InMemoryRoleStore : IQueryableRoleStore where TRole : class,IRole + public class InMemoryRoleStore : IQueryableRoleStore where TRole : InMemoryRole { private readonly Dictionary _roles = new Dictionary(); @@ -27,6 +27,16 @@ namespace Microsoft.AspNet.Identity.InMemory return Task.FromResult(0); } + public Task GetRoleId(TRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(role.Id); + } + + public Task GetRoleName(TRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(role.Name); + } + public Task Update(TRole role, CancellationToken cancellationToken = default(CancellationToken)) { _roles[role.Id] = role; diff --git a/src/Microsoft.AspNet.Identity.InMemory/InMemoryUser.cs b/src/Microsoft.AspNet.Identity.InMemory/InMemoryUser.cs index f9e18f29a7..9d9cd8b3cd 100644 --- a/src/Microsoft.AspNet.Identity.InMemory/InMemoryUser.cs +++ b/src/Microsoft.AspNet.Identity.InMemory/InMemoryUser.cs @@ -4,7 +4,7 @@ using System.Security.Claims; namespace Microsoft.AspNet.Identity.InMemory { - public class InMemoryUser : IUser + public class InMemoryUser { private readonly IList _claims; private readonly IList _logins; diff --git a/src/Microsoft.AspNet.Identity.InMemory/InMemoryUserStore.cs b/src/Microsoft.AspNet.Identity.InMemory/InMemoryUserStore.cs index b1c0782385..f343799506 100644 --- a/src/Microsoft.AspNet.Identity.InMemory/InMemoryUserStore.cs +++ b/src/Microsoft.AspNet.Identity.InMemory/InMemoryUserStore.cs @@ -8,16 +8,16 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Identity.InMemory { public class InMemoryUserStore : - IUserLoginStore, - IUserRoleStore, - IUserClaimStore, - IUserPasswordStore, - IUserSecurityStampStore, - IUserEmailStore, - IUserLockoutStore, - IUserPhoneNumberStore, - IQueryableUserStore, - IUserTwoFactorStore + IUserLoginStore, + IUserRoleStore, + IUserClaimStore, + IUserPasswordStore, + IUserSecurityStampStore, + IUserEmailStore, + IUserLockoutStore, + IUserPhoneNumberStore, + IQueryableUserStore, + IUserTwoFactorStore where TUser : InMemoryUser { private readonly Dictionary _logins = @@ -149,6 +149,16 @@ namespace Microsoft.AspNet.Identity.InMemory return Task.FromResult(null); } + public Task GetUserId(TUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(user.Id); + } + + public Task GetUserName(TUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(user.UserName); + } + public Task Create(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { _users[user.Id] = user; diff --git a/src/Microsoft.AspNet.Identity.Security/SignInManager.cs b/src/Microsoft.AspNet.Identity.Security/SignInManager.cs index 721cb98ce1..b4e0e9cfec 100644 --- a/src/Microsoft.AspNet.Identity.Security/SignInManager.cs +++ b/src/Microsoft.AspNet.Identity.Security/SignInManager.cs @@ -7,9 +7,7 @@ using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Identity.Security { - public class SignInManager - where TUser : class, IUser - where TKey : IEquatable + public class SignInManager where TUser : class { private string _authType; public string AuthenticationType @@ -18,7 +16,7 @@ namespace Microsoft.AspNet.Identity.Security set { _authType = value; } } - public UserManager UserManager { get; set; } + public UserManager UserManager { get; set; } public HttpContext Context { get; set; } @@ -139,7 +137,9 @@ namespace Microsoft.AspNet.Identity.Security { return SignInStatus.Failure; } - if (await UserManager.IsLockedOut(user.Id)) + // TODO: overloads taking TUser? + var userId = await UserManager.GetUserId(user); + if (await UserManager.IsLockedOut(userId)) { return SignInStatus.LockedOut; } @@ -152,8 +152,8 @@ namespace Microsoft.AspNet.Identity.Security if (shouldLockout) { // If lockout is requested, increment access failed count which might lock out the user - await UserManager.AccessFailed(user.Id); - if (await UserManager.IsLockedOut(user.Id)) + await UserManager.AccessFailed(userId); + if (await UserManager.IsLockedOut(userId)) { return SignInStatus.LockedOut; } diff --git a/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs b/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs index fe2dd0a4ad..37f5d892dc 100644 --- a/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs +++ b/src/Microsoft.AspNet.Identity/ClaimsIdentityFactory.cs @@ -10,10 +10,8 @@ namespace Microsoft.AspNet.Identity /// Creates a ClaimsIdentity from a User /// /// - /// - public class ClaimsIdentityFactory : IClaimsIdentityFactory - where TUser : class, IUser - where TKey : IEquatable + public class ClaimsIdentityFactory : IClaimsIdentityFactory + where TUser : class { /// /// ClaimType used for the security stamp by default @@ -57,8 +55,9 @@ namespace Microsoft.AspNet.Identity /// /// /// + /// /// - public virtual async Task Create(UserManager manager, TUser user, + public virtual async Task Create(UserManager manager, TUser user, string authenticationType, CancellationToken cancellationToken = default(CancellationToken)) { if (manager == null) @@ -69,16 +68,18 @@ namespace Microsoft.AspNet.Identity { throw new ArgumentNullException("user"); } + var userId = await manager.GetUserId(user, cancellationToken); + var userName = await manager.GetUserName(user, cancellationToken); var id = new ClaimsIdentity(authenticationType, UserNameClaimType, RoleClaimType); - id.AddClaim(new Claim(UserIdClaimType, Convert.ToString(user.Id, CultureInfo.InvariantCulture), ClaimValueTypes.String)); - id.AddClaim(new Claim(UserNameClaimType, user.UserName, ClaimValueTypes.String)); + id.AddClaim(new Claim(UserIdClaimType, userId)); + id.AddClaim(new Claim(UserNameClaimType, userName, ClaimValueTypes.String)); if (manager.SupportsUserSecurityStamp) { - id.AddClaim(new Claim(SecurityStampClaimType, await manager.GetSecurityStamp(user.Id, cancellationToken))); + id.AddClaim(new Claim(SecurityStampClaimType, await manager.GetSecurityStamp(userId, cancellationToken))); } if (manager.SupportsUserRole) { - var roles = await manager.GetRoles(user.Id, cancellationToken); + var roles = await manager.GetRoles(userId, cancellationToken); foreach (var roleName in roles) { id.AddClaim(new Claim(RoleClaimType, roleName, ClaimValueTypes.String)); @@ -86,7 +87,7 @@ namespace Microsoft.AspNet.Identity } if (manager.SupportsUserClaim) { - id.AddClaims(await manager.GetClaims(user.Id, cancellationToken)); + id.AddClaims(await manager.GetClaims(userId, cancellationToken)); } return id; } diff --git a/src/Microsoft.AspNet.Identity/IClaimsIdentityFactory.cs b/src/Microsoft.AspNet.Identity/IClaimsIdentityFactory.cs index 1a029c9b59..6e8f15ce4b 100644 --- a/src/Microsoft.AspNet.Identity/IClaimsIdentityFactory.cs +++ b/src/Microsoft.AspNet.Identity/IClaimsIdentityFactory.cs @@ -9,10 +9,8 @@ namespace Microsoft.AspNet.Identity /// Interface for creating a ClaimsIdentity from an IUser /// /// - /// - public interface IClaimsIdentityFactory - where TUser : class, IUser - where TKey : IEquatable + public interface IClaimsIdentityFactory + where TUser : class { /// /// Create a ClaimsIdentity from an user using a UserManager @@ -22,6 +20,6 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Create(UserManager manager, TUser user, string authenticationType, CancellationToken cancellationToken = default(CancellationToken)); + Task Create(UserManager manager, TUser user, string authenticationType, CancellationToken cancellationToken = default(CancellationToken)); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IQueryableRoleStore.cs b/src/Microsoft.AspNet.Identity/IQueryableRoleStore.cs index 93c30f3a92..3c49d04c32 100644 --- a/src/Microsoft.AspNet.Identity/IQueryableRoleStore.cs +++ b/src/Microsoft.AspNet.Identity/IQueryableRoleStore.cs @@ -6,16 +6,7 @@ namespace Microsoft.AspNet.Identity /// Interface that exposes an IQueryable roles /// /// - public interface IQueryableRoleStore : IQueryableRoleStore where TRole : IRole - { - } - - /// - /// Interface that exposes an IQueryable roles - /// - /// - /// - public interface IQueryableRoleStore : IRoleStore where TRole : IRole + public interface IQueryableRoleStore : IRoleStore where TRole : class { /// /// IQueryable users diff --git a/src/Microsoft.AspNet.Identity/IQueryableUserStore.cs b/src/Microsoft.AspNet.Identity/IQueryableUserStore.cs index d8e26b7e6b..43af7e86f9 100644 --- a/src/Microsoft.AspNet.Identity/IQueryableUserStore.cs +++ b/src/Microsoft.AspNet.Identity/IQueryableUserStore.cs @@ -2,20 +2,12 @@ namespace Microsoft.AspNet.Identity { - /// - /// Interface that exposes an IQueryable users - /// - /// - public interface IQueryableUserStore : IQueryableUserStore where TUser : class, IUser - { - } - /// /// Interface that exposes an IQueryable users /// /// /// - public interface IQueryableUserStore : IUserStore where TUser : class, IUser + public interface IQueryableUserStore : IUserStore where TUser : class { /// /// IQueryable users diff --git a/src/Microsoft.AspNet.Identity/IRole.cs b/src/Microsoft.AspNet.Identity/IRole.cs index 8cebb0189c..01b724ccac 100644 --- a/src/Microsoft.AspNet.Identity/IRole.cs +++ b/src/Microsoft.AspNet.Identity/IRole.cs @@ -1,19 +1,19 @@ -namespace Microsoft.AspNet.Identity -{ - /// - /// Mimimal set of data needed to persist role data - /// - /// - public interface IRole - { - /// - /// Id of the role - /// - TKey Id { get; } +//namespace Microsoft.AspNet.Identity +//{ +// /// +// /// Mimimal set of data needed to persist role data +// /// +// /// +// public interface IRole +// { +// /// +// /// Id of the role +// /// +// TKey Id { get; } - /// - /// Name of the role - /// - string Name { get; set; } - } -} \ No newline at end of file +// /// +// /// Name of the role +// /// +// string Name { get; set; } +// } +//} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IRoleStore.cs b/src/Microsoft.AspNet.Identity/IRoleStore.cs index 7205a9deff..04e9a600e6 100644 --- a/src/Microsoft.AspNet.Identity/IRoleStore.cs +++ b/src/Microsoft.AspNet.Identity/IRoleStore.cs @@ -8,8 +8,7 @@ namespace Microsoft.AspNet.Identity /// Interface that exposes basic role management /// /// - /// - public interface IRoleStore : IDisposable where TRole : IRole + public interface IRoleStore : IDisposable where TRole : class { /// /// Insert a new role @@ -35,13 +34,29 @@ namespace Microsoft.AspNet.Identity /// Task Delete(TRole role, CancellationToken cancellationToken = default(CancellationToken)); + /// + /// Returns a role's id + /// + /// + /// + /// + Task GetRoleId(TRole role, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Returns a role's name + /// + /// + /// + /// + Task GetRoleName(TRole role, CancellationToken cancellationToken = default(CancellationToken)); + /// /// Finds a role by id /// /// /// /// - Task FindById(TKey roleId, CancellationToken cancellationToken = default(CancellationToken)); + Task FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken)); /// /// Find a role by name diff --git a/src/Microsoft.AspNet.Identity/IRoleValidator.cs b/src/Microsoft.AspNet.Identity/IRoleValidator.cs index b41c6f6305..71bdef4d66 100644 --- a/src/Microsoft.AspNet.Identity/IRoleValidator.cs +++ b/src/Microsoft.AspNet.Identity/IRoleValidator.cs @@ -9,9 +9,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public interface IRoleValidator - where TRole : class, IRole - where TKey : IEquatable + public interface IRoleValidator where TRole : class { /// /// Validate the user @@ -20,6 +18,6 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Validate(RoleManager manager, TRole role, CancellationToken cancellationToken = default(CancellationToken)); + Task Validate(RoleManager manager, TRole role, CancellationToken cancellationToken = default(CancellationToken)); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUser.cs b/src/Microsoft.AspNet.Identity/IUser.cs index 432c76534e..81030f66b8 100644 --- a/src/Microsoft.AspNet.Identity/IUser.cs +++ b/src/Microsoft.AspNet.Identity/IUser.cs @@ -1,19 +1,19 @@ -namespace Microsoft.AspNet.Identity -{ - /// - /// Minimal interface for a user with id and username - /// - /// - public interface IUser - { - /// - /// Unique key for the user - /// - TKey Id { get; } +//namespace Microsoft.AspNet.Identity +//{ +// /// +// /// Minimal interface for a user with id and username +// /// +// /// +// public interface IUser +// { +// /// +// /// Unique key for the user +// /// +// TKey Id { get; } - /// - /// Unique username - /// - string UserName { get; set; } - } -} \ No newline at end of file +// /// +// /// Unique username +// /// +// string UserName { get; set; } +// } +//} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUserClaimStore.cs b/src/Microsoft.AspNet.Identity/IUserClaimStore.cs index f2e50e2959..af914c2b36 100644 --- a/src/Microsoft.AspNet.Identity/IUserClaimStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserClaimStore.cs @@ -9,8 +9,7 @@ namespace Microsoft.AspNet.Identity /// Stores user specific claims /// /// - /// - public interface IUserClaimStore : IUserStore where TUser : class, IUser + public interface IUserClaimStore : IUserStore where TUser : class { /// /// Returns the claims for the user with the issuer set diff --git a/src/Microsoft.AspNet.Identity/IUserEmailStore.cs b/src/Microsoft.AspNet.Identity/IUserEmailStore.cs index bd18f09d25..50671587c6 100644 --- a/src/Microsoft.AspNet.Identity/IUserEmailStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserEmailStore.cs @@ -7,8 +7,7 @@ namespace Microsoft.AspNet.Identity /// Stores a user's email /// /// - /// - public interface IUserEmailStore : IUserStore where TUser : class, IUser + public interface IUserEmailStore : IUserStore where TUser : class { /// /// Set the user email diff --git a/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs b/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs index b40e6f07dc..93bd3cd20d 100644 --- a/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs @@ -8,8 +8,7 @@ namespace Microsoft.AspNet.Identity /// Stores information which can be used to implement account lockout, including access failures and lockout status /// /// - /// - public interface IUserLockoutStore : IUserStore where TUser : class, IUser + public interface IUserLockoutStore : IUserStore where TUser : class { /// /// Returns the DateTimeOffset that represents the end of a user's lockout, any time in the past should be considered diff --git a/src/Microsoft.AspNet.Identity/IUserLoginStore.cs b/src/Microsoft.AspNet.Identity/IUserLoginStore.cs index a5f19f5b80..b38c490507 100644 --- a/src/Microsoft.AspNet.Identity/IUserLoginStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserLoginStore.cs @@ -8,8 +8,7 @@ namespace Microsoft.AspNet.Identity /// Interface that maps users to login providers, i.e. Google, Facebook, Twitter, Microsoft /// /// - /// - public interface IUserLoginStore : IUserStore where TUser : class, IUser + public interface IUserLoginStore : IUserStore where TUser : class { /// /// Adds a user login with the specified provider and key diff --git a/src/Microsoft.AspNet.Identity/IUserNameStore.cs b/src/Microsoft.AspNet.Identity/IUserNameStore.cs new file mode 100644 index 0000000000..885198b37c --- /dev/null +++ b/src/Microsoft.AspNet.Identity/IUserNameStore.cs @@ -0,0 +1,37 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Identity +{ + /// + /// Stores a user's email + /// + /// + public interface IUserNameStore : IUserStore where TUser : class + { + /// + /// Set the user name + /// + /// + /// + /// + /// + Task SetUserName(TUser user, string userName, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Get the user name + /// + /// + /// + /// + Task GetUserName(TUser user, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Returns the user associated with this name + /// + /// + /// + /// + Task FindByName(string name, CancellationToken cancellationToken = default(CancellationToken)); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUserPasswordStore.cs b/src/Microsoft.AspNet.Identity/IUserPasswordStore.cs index 2c4c343815..48f6a694ce 100644 --- a/src/Microsoft.AspNet.Identity/IUserPasswordStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserPasswordStore.cs @@ -7,8 +7,7 @@ namespace Microsoft.AspNet.Identity /// Stores a user's password hash /// /// - /// - public interface IUserPasswordStore : IUserStore where TUser : class, IUser + public interface IUserPasswordStore : IUserStore where TUser : class { /// /// Set the user password hash diff --git a/src/Microsoft.AspNet.Identity/IUserPhoneNumberStore.cs b/src/Microsoft.AspNet.Identity/IUserPhoneNumberStore.cs index f342f00be5..4246136693 100644 --- a/src/Microsoft.AspNet.Identity/IUserPhoneNumberStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserPhoneNumberStore.cs @@ -7,8 +7,7 @@ namespace Microsoft.AspNet.Identity /// Stores a user's phoneNumber /// /// - /// - public interface IUserPhoneNumberStore : IUserStore where TUser : class, IUser + public interface IUserPhoneNumberStore : IUserStore where TUser : class { /// /// Set the user PhoneNumber diff --git a/src/Microsoft.AspNet.Identity/IUserRoleStore.cs b/src/Microsoft.AspNet.Identity/IUserRoleStore.cs index 180c74c287..7e135f3699 100644 --- a/src/Microsoft.AspNet.Identity/IUserRoleStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserRoleStore.cs @@ -8,8 +8,7 @@ namespace Microsoft.AspNet.Identity /// Interface that maps users to their roles /// /// - /// - public interface IUserRoleStore : IUserStore where TUser : class, IUser + public interface IUserRoleStore : IUserStore where TUser : class { /// /// Adds a user to role diff --git a/src/Microsoft.AspNet.Identity/IUserSecurityStampStore.cs b/src/Microsoft.AspNet.Identity/IUserSecurityStampStore.cs index db79cf58d2..5f7596a02b 100644 --- a/src/Microsoft.AspNet.Identity/IUserSecurityStampStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserSecurityStampStore.cs @@ -7,8 +7,7 @@ namespace Microsoft.AspNet.Identity /// Stores a user's security stamp /// /// - /// - public interface IUserSecurityStampStore : IUserStore where TUser : class, IUser + public interface IUserSecurityStampStore : IUserStore where TUser : class { /// /// Set the security stamp for the user diff --git a/src/Microsoft.AspNet.Identity/IUserStore.cs b/src/Microsoft.AspNet.Identity/IUserStore.cs index e6b857411f..a030602824 100644 --- a/src/Microsoft.AspNet.Identity/IUserStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserStore.cs @@ -9,8 +9,24 @@ namespace Microsoft.AspNet.Identity /// /// /// - public interface IUserStore : IDisposable where TUser : class, IUser + public interface IUserStore : IDisposable where TUser : class { + /// + /// Returns the user id for a user + /// + /// + /// + /// + Task GetUserId(TUser user, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Returns the user's name + /// + /// + /// + /// + Task GetUserName(TUser user, CancellationToken cancellationToken = default(CancellationToken)); + /// /// Insert a new user /// @@ -41,14 +57,15 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task FindById(TKey userId, CancellationToken cancellationToken = default(CancellationToken)); + Task FindById(string userId, CancellationToken cancellationToken = default(CancellationToken)); /// - /// Find a user by name + /// Returns the user associated with this name /// - /// + /// /// /// - Task FindByName(string userName, CancellationToken cancellationToken = default(CancellationToken)); + Task FindByName(string name, CancellationToken cancellationToken = default(CancellationToken)); + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs b/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs index 1595237e53..27ef69fa94 100644 --- a/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs +++ b/src/Microsoft.AspNet.Identity/IUserTokenProvider.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Identity /// /// Interface to generate user tokens /// - public interface IUserTokenProvider where TUser : class, IUser where TKey : IEquatable + public interface IUserTokenProvider where TUser : class { /// /// Generate a token for a user @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Generate(string purpose, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); + Task Generate(string purpose, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); /// /// Validate and unprotect a token, returns null if invalid @@ -28,7 +28,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Validate(string purpose, string token, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); + Task Validate(string purpose, string token, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); /// /// Notifies the user that a token has been generated, i.e. via email or sms, or can no-op @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Notify(string token, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); + Task Notify(string token, UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); /// /// Returns true if provider can be used for this user, i.e. could require a user to have an email @@ -47,6 +47,6 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task IsValidProviderForUser(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); + Task IsValidProviderForUser(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IUserTwoFactorStore.cs b/src/Microsoft.AspNet.Identity/IUserTwoFactorStore.cs index f7384eb90d..8f85a62ed3 100644 --- a/src/Microsoft.AspNet.Identity/IUserTwoFactorStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserTwoFactorStore.cs @@ -7,8 +7,7 @@ namespace Microsoft.AspNet.Identity /// Stores whether two factor is enabled for a user /// /// - /// - public interface IUserTwoFactorStore : IUserStore where TUser : class, IUser + public interface IUserTwoFactorStore : IUserStore where TUser : class { /// /// Sets whether two factor is enabled for the user diff --git a/src/Microsoft.AspNet.Identity/IUserValidator.cs b/src/Microsoft.AspNet.Identity/IUserValidator.cs index 3d72915f62..e4d64da6c3 100644 --- a/src/Microsoft.AspNet.Identity/IUserValidator.cs +++ b/src/Microsoft.AspNet.Identity/IUserValidator.cs @@ -8,10 +8,7 @@ namespace Microsoft.AspNet.Identity /// Used to validate a user /// /// - /// - public interface IUserValidator - where TUser : class, IUser - where TKey : IEquatable + public interface IUserValidator where TUser : class { /// /// Validate the user @@ -20,6 +17,6 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task Validate(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); + Task Validate(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/RoleManager.cs b/src/Microsoft.AspNet.Identity/RoleManager.cs index 535e574ba6..909c2030a8 100644 --- a/src/Microsoft.AspNet.Identity/RoleManager.cs +++ b/src/Microsoft.AspNet.Identity/RoleManager.cs @@ -9,26 +9,7 @@ namespace Microsoft.AspNet.Identity /// Exposes role related api which will automatically save changes to the RoleStore /// /// - public class RoleManager : RoleManager where TRole : class, IRole - { - /// - /// Constructor - /// - /// - public RoleManager(IRoleStore store) - : base(store) - { - } - } - - /// - /// Exposes role related api which will automatically save changes to the RoleStore - /// - /// - /// - public class RoleManager : IDisposable - where TRole : class, IRole - where TKey : IEquatable + public class RoleManager : IDisposable where TRole : class { private bool _disposed; @@ -36,25 +17,25 @@ namespace Microsoft.AspNet.Identity /// Constructor /// /// The IRoleStore is responsible for commiting changes via the UpdateAsync/CreateAsync methods - public RoleManager(IRoleStore store) + public RoleManager(IRoleStore store) { if (store == null) { throw new ArgumentNullException("store"); } Store = store; - RoleValidator = new RoleValidator(); + RoleValidator = new RoleValidator(); } /// /// Persistence abstraction that the Manager operates against /// - protected IRoleStore Store { get; private set; } + protected IRoleStore Store { get; private set; } /// /// Used to validate roles before persisting changes /// - public IRoleValidator RoleValidator { get; set; } + public IRoleValidator RoleValidator { get; set; } /// /// Returns an IQueryable of roles if the store is an IQueryableRoleStore @@ -63,7 +44,7 @@ namespace Microsoft.AspNet.Identity { get { - var queryableStore = Store as IQueryableRoleStore; + var queryableStore = Store as IQueryableRoleStore; if (queryableStore == null) { throw new NotSupportedException(Resources.StoreNotIQueryableRoleStore); @@ -80,7 +61,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IQueryableRoleStore; + return Store is IQueryableRoleStore; } } @@ -185,12 +166,36 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task FindById(TKey roleId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); return await Store.FindById(roleId, cancellationToken); } + /// + /// Return the name of the role + /// + /// + /// + /// + public virtual async Task GetRoleName(TRole role, CancellationToken cancellationToken = default(CancellationToken)) + { + ThrowIfDisposed(); + return await Store.GetRoleName(role, cancellationToken); + } + + /// + /// Return the role id for a role + /// + /// + /// + /// + public virtual async Task GetRoleId(TRole role, CancellationToken cancellationToken = default(CancellationToken)) + { + ThrowIfDisposed(); + return await Store.GetRoleId(role, cancellationToken); + } + /// /// Find a role by name /// diff --git a/src/Microsoft.AspNet.Identity/RoleValidator.cs b/src/Microsoft.AspNet.Identity/RoleValidator.cs index dcd649272a..1992bdb51c 100644 --- a/src/Microsoft.AspNet.Identity/RoleValidator.cs +++ b/src/Microsoft.AspNet.Identity/RoleValidator.cs @@ -10,10 +10,7 @@ namespace Microsoft.AspNet.Identity /// Validates roles before they are saved /// /// - /// - public class RoleValidator : IRoleValidator - where TRole : class, IRole - where TKey : IEquatable + public class RoleValidator : IRoleValidator where TRole : class { /// /// Validates a role before saving @@ -22,7 +19,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task Validate(RoleManager manager, TRole role, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task Validate(RoleManager manager, TRole role, CancellationToken cancellationToken = default(CancellationToken)) { if (manager == null) { @@ -41,19 +38,20 @@ namespace Microsoft.AspNet.Identity return IdentityResult.Success; } - private static async Task ValidateRoleName(RoleManager manager, TRole role, + private static async Task ValidateRoleName(RoleManager manager, TRole role, ICollection errors) { - if (string.IsNullOrWhiteSpace(role.Name)) + var roleName = await manager.GetRoleName(role); + if (string.IsNullOrWhiteSpace(roleName)) { errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "Name")); } else { - var owner = await manager.FindByName(role.Name); - if (owner != null && !EqualityComparer.Default.Equals(owner.Id, role.Id)) + var owner = await manager.FindByName(roleName); + if (owner != null && !string.Equals(await manager.GetRoleId(owner), await manager.GetRoleId(role))) { - errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, role.Name)); + errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, roleName)); } } } diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs index 3863816ad6..ae0b96b264 100644 --- a/src/Microsoft.AspNet.Identity/UserManager.cs +++ b/src/Microsoft.AspNet.Identity/UserManager.cs @@ -14,15 +14,12 @@ namespace Microsoft.AspNet.Identity /// Exposes user related api which will automatically save changes to the UserStore /// /// - /// - public class UserManager : IDisposable - where TUser : class, IUser - where TKey : IEquatable + public class UserManager : IDisposable where TUser : class { - private readonly Dictionary> _factors = - new Dictionary>(); + private readonly Dictionary> _factors = + new Dictionary>(); - private IClaimsIdentityFactory _claimsFactory; + private IClaimsIdentityFactory _claimsFactory; private TimeSpan _defaultLockout = TimeSpan.Zero; private bool _disposed; private IPasswordHasher _passwordHasher; @@ -40,10 +37,10 @@ namespace Microsoft.AspNet.Identity throw new ArgumentNullException("serviceProvider"); } PasswordHasher = serviceProvider.GetService(); - UserValidator = serviceProvider.GetService>(); + UserValidator = serviceProvider.GetService>(); PasswordValidator = serviceProvider.GetService(); - ClaimsIdentityFactory = serviceProvider.GetService>(); - Store = serviceProvider.GetService>(); + ClaimsIdentityFactory = serviceProvider.GetService>(); + Store = serviceProvider.GetService>(); // TODO: maybe each optional store as well? Email and SMS services? } @@ -51,22 +48,22 @@ namespace Microsoft.AspNet.Identity /// Constructor /// /// The IUserStore is responsible for commiting changes via the UpdateAsync/CreateAsync methods - public UserManager(IUserStore store) + public UserManager(IUserStore store) { if (store == null) { throw new ArgumentNullException("store"); } Store = store; - UserValidator = new UserValidator(); + UserValidator = new UserValidator(); PasswordHasher = new PasswordHasher(); - ClaimsIdentityFactory = new ClaimsIdentityFactory(); + ClaimsIdentityFactory = new ClaimsIdentityFactory(); } /// /// Persistence abstraction that the Manager operates against /// - protected internal IUserStore Store { get; set; } + protected internal IUserStore Store { get; set; } /// /// Used to hash/verify passwords @@ -92,7 +89,7 @@ namespace Microsoft.AspNet.Identity /// /// Used to validate users before persisting changes /// - public IUserValidator UserValidator { get; set; } + public IUserValidator UserValidator { get; set; } /// /// Used to validate passwords before persisting changes @@ -102,7 +99,7 @@ namespace Microsoft.AspNet.Identity /// /// Used to create claims identities from users /// - public IClaimsIdentityFactory ClaimsIdentityFactory + public IClaimsIdentityFactory ClaimsIdentityFactory { get { @@ -133,7 +130,7 @@ namespace Microsoft.AspNet.Identity /// /// Used for generating ResetPassword and Confirmation Tokens /// - public IUserTokenProvider UserTokenProvider { get; set; } + public IUserTokenProvider UserTokenProvider { get; set; } /// /// If true, will enable user lockout when users are created @@ -162,7 +159,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserTwoFactorStore; + return Store is IUserTwoFactorStore; } } @@ -174,7 +171,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserPasswordStore; + return Store is IUserPasswordStore; } } @@ -186,7 +183,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserSecurityStampStore; + return Store is IUserSecurityStampStore; } } @@ -198,7 +195,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserRoleStore; + return Store is IUserRoleStore; } } @@ -210,7 +207,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserLoginStore; + return Store is IUserLoginStore; } } @@ -222,7 +219,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserEmailStore; + return Store is IUserEmailStore; } } @@ -234,7 +231,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserPhoneNumberStore; + return Store is IUserPhoneNumberStore; } } @@ -246,7 +243,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserClaimStore; + return Store is IUserClaimStore; } } @@ -258,7 +255,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IUserLockoutStore; + return Store is IUserLockoutStore; } } @@ -270,7 +267,7 @@ namespace Microsoft.AspNet.Identity get { ThrowIfDisposed(); - return Store is IQueryableUserStore; + return Store is IQueryableUserStore; } } @@ -281,7 +278,7 @@ namespace Microsoft.AspNet.Identity { get { - var queryableStore = Store as IQueryableUserStore; + var queryableStore = Store as IQueryableUserStore; if (queryableStore == null) { throw new NotSupportedException(Resources.StoreNotIQueryableUserStore); @@ -293,7 +290,7 @@ namespace Microsoft.AspNet.Identity /// /// Dictionary mapping user two factor providers /// - public IDictionary> TwoFactorProviders + public IDictionary> TwoFactorProviders { get { return _factors; } } @@ -399,7 +396,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual Task FindById(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task FindById(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); return Store.FindById(userId, cancellationToken); @@ -422,9 +419,9 @@ namespace Microsoft.AspNet.Identity } // IUserPasswordStore methods - private IUserPasswordStore GetPasswordStore() + private IUserPasswordStore GetPasswordStore() { - var cast = Store as IUserPasswordStore; + var cast = Store as IUserPasswordStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserPasswordStore); @@ -458,6 +455,30 @@ namespace Microsoft.AspNet.Identity return await Create(user, cancellationToken); } + /// + /// Get the user's name + /// + /// + /// + /// + public virtual async Task GetUserName(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + { + ThrowIfDisposed(); + return await Store.GetUserName(user, cancellationToken); + } + + /// + /// Get the user's id + /// + /// + /// + /// + public virtual async Task GetUserId(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + { + ThrowIfDisposed(); + return await Store.GetUserId(user, cancellationToken); + } + /// /// Return a user with the specified username and password or null if there is no match. /// @@ -500,7 +521,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task HasPassword(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task HasPassword(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var passwordStore = GetPasswordStore(); @@ -520,7 +541,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task AddPassword(TKey userId, string password, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task AddPassword(string userId, string password, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var passwordStore = GetPasswordStore(); @@ -551,7 +572,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task ChangePassword(TKey userId, string currentPassword, + public virtual async Task ChangePassword(string userId, string currentPassword, string newPassword, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); @@ -580,7 +601,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task RemovePassword(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task RemovePassword(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var passwordStore = GetPasswordStore(); @@ -595,7 +616,7 @@ namespace Microsoft.AspNet.Identity return await Update(user, cancellationToken); } - internal async Task UpdatePasswordInternal(IUserPasswordStore passwordStore, + internal async Task UpdatePasswordInternal(IUserPasswordStore passwordStore, TUser user, string newPassword, CancellationToken cancellationToken) { if (PasswordValidator != null) @@ -620,7 +641,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - protected virtual async Task VerifyPassword(IUserPasswordStore store, TUser user, + protected virtual async Task VerifyPassword(IUserPasswordStore store, TUser user, string password, CancellationToken cancellationToken = default(CancellationToken)) { var hash = await store.GetPasswordHash(user, cancellationToken); @@ -628,9 +649,9 @@ namespace Microsoft.AspNet.Identity } // IUserSecurityStampStore methods - private IUserSecurityStampStore GetSecurityStore() + private IUserSecurityStampStore GetSecurityStore() { - var cast = Store as IUserSecurityStampStore; + var cast = Store as IUserSecurityStampStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserSecurityStampStore); @@ -644,7 +665,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetSecurityStamp(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetSecurityStamp(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var securityStore = GetSecurityStore(); @@ -663,7 +684,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task UpdateSecurityStamp(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task UpdateSecurityStamp(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var securityStore = GetSecurityStore(); @@ -683,7 +704,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GeneratePasswordResetToken(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GeneratePasswordResetToken(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); return await GenerateUserToken("ResetPassword", userId, cancellationToken); @@ -697,7 +718,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task ResetPassword(TKey userId, string token, string newPassword, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task ResetPassword(string userId, string token, string newPassword, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var user = await FindById(userId, cancellationToken); @@ -735,9 +756,9 @@ namespace Microsoft.AspNet.Identity } // IUserLoginStore methods - private IUserLoginStore GetLoginStore() + private IUserLoginStore GetLoginStore() { - var cast = Store as IUserLoginStore; + var cast = Store as IUserLoginStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserLoginStore); @@ -762,7 +783,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task RemoveLogin(TKey userId, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task RemoveLogin(string userId, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var loginStore = GetLoginStore(); @@ -788,7 +809,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task AddLogin(TKey userId, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task AddLogin(string userId, UserLoginInfo login, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var loginStore = GetLoginStore(); @@ -817,7 +838,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task> GetLogins(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task> GetLogins(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var loginStore = GetLoginStore(); @@ -831,9 +852,9 @@ namespace Microsoft.AspNet.Identity } // IUserClaimStore methods - private IUserClaimStore GetClaimStore() + private IUserClaimStore GetClaimStore() { - var cast = Store as IUserClaimStore; + var cast = Store as IUserClaimStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserClaimStore); @@ -848,7 +869,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task AddClaim(TKey userId, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task AddClaim(string userId, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var claimStore = GetClaimStore(); @@ -873,7 +894,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task RemoveClaim(TKey userId, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task RemoveClaim(string userId, Claim claim, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var claimStore = GetClaimStore(); @@ -893,7 +914,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task> GetClaims(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task> GetClaims(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var claimStore = GetClaimStore(); @@ -906,9 +927,9 @@ namespace Microsoft.AspNet.Identity return await claimStore.GetClaims(user, cancellationToken); } - private IUserRoleStore GetUserRoleStore() + private IUserRoleStore GetUserRoleStore() { - var cast = Store as IUserRoleStore; + var cast = Store as IUserRoleStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserRoleStore); @@ -923,7 +944,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task AddToRole(TKey userId, string role, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task AddToRole(string userId, string role, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var userRoleStore = GetUserRoleStore(); @@ -949,7 +970,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task RemoveFromRole(TKey userId, string role, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task RemoveFromRole(string userId, string role, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var userRoleStore = GetUserRoleStore(); @@ -973,7 +994,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task> GetRoles(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task> GetRoles(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var userRoleStore = GetUserRoleStore(); @@ -993,7 +1014,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task IsInRole(TKey userId, string role, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task IsInRole(string userId, string role, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var userRoleStore = GetUserRoleStore(); @@ -1007,9 +1028,9 @@ namespace Microsoft.AspNet.Identity } // IUserEmailStore methods - internal IUserEmailStore GetEmailStore() + internal IUserEmailStore GetEmailStore() { - var cast = Store as IUserEmailStore; + var cast = Store as IUserEmailStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserEmailStore); @@ -1022,7 +1043,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetEmail(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetEmail(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetEmailStore(); @@ -1041,7 +1062,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetEmail(TKey userId, string email, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SetEmail(string userId, string email, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetEmailStore(); @@ -1078,7 +1099,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual Task GenerateEmailConfirmationToken(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task GenerateEmailConfirmationToken(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); return GenerateUserToken("Confirmation", userId, cancellationToken); @@ -1091,7 +1112,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task ConfirmEmail(TKey userId, string token, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task ConfirmEmail(string userId, string token, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetEmailStore(); @@ -1115,7 +1136,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task IsEmailConfirmed(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task IsEmailConfirmed(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetEmailStore(); @@ -1129,9 +1150,9 @@ namespace Microsoft.AspNet.Identity } // IUserPhoneNumberStore methods - internal IUserPhoneNumberStore GetPhoneNumberStore() + internal IUserPhoneNumberStore GetPhoneNumberStore() { - var cast = Store as IUserPhoneNumberStore; + var cast = Store as IUserPhoneNumberStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserPhoneNumberStore); @@ -1145,7 +1166,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetPhoneNumber(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetPhoneNumber(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetPhoneNumberStore(); @@ -1165,7 +1186,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetPhoneNumber(TKey userId, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SetPhoneNumber(string userId, string phoneNumber, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetPhoneNumberStore(); @@ -1189,7 +1210,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task ChangePhoneNumber(TKey userId, string phoneNumber, string token, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task ChangePhoneNumber(string userId, string phoneNumber, string token, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetPhoneNumberStore(); @@ -1215,7 +1236,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task IsPhoneNumberConfirmed(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task IsPhoneNumberConfirmed(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetPhoneNumberStore(); @@ -1231,7 +1252,7 @@ namespace Microsoft.AspNet.Identity // Two factor APIS #if NET45 - internal async Task CreateSecurityToken(TKey userId) + internal async Task CreateSecurityToken(string userId) { return new SecurityToken(Encoding.Unicode.GetBytes(await GetSecurityStamp(userId))); @@ -1243,7 +1264,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GenerateChangePhoneNumberToken(TKey userId, string phoneNumber) + public virtual async Task GenerateChangePhoneNumberToken(string userId, string phoneNumber) { ThrowIfDisposed(); return @@ -1259,7 +1280,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task VerifyChangePhoneNumberToken(TKey userId, string token, string phoneNumber) + public virtual async Task VerifyChangePhoneNumberToken(string userId, string token, string phoneNumber) { ThrowIfDisposed(); #if NET45 @@ -1281,7 +1302,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task VerifyUserToken(TKey userId, string purpose, string token, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task VerifyUserToken(string userId, string purpose, string token, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); if (UserTokenProvider == null) @@ -1305,7 +1326,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GenerateUserToken(string purpose, TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GenerateUserToken(string purpose, string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); if (UserTokenProvider == null) @@ -1326,7 +1347,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual void RegisterTwoFactorProvider(string twoFactorProvider, IUserTokenProvider provider) + public virtual void RegisterTwoFactorProvider(string twoFactorProvider, IUserTokenProvider provider) { ThrowIfDisposed(); if (twoFactorProvider == null) @@ -1346,7 +1367,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task> GetValidTwoFactorProviders(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task> GetValidTwoFactorProviders(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var user = await FindById(userId, cancellationToken); @@ -1374,7 +1395,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task VerifyTwoFactorToken(TKey userId, string twoFactorProvider, string token, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task VerifyTwoFactorToken(string userId, string twoFactorProvider, string token, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var user = await FindById(userId, cancellationToken); @@ -1400,7 +1421,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GenerateTwoFactorToken(TKey userId, string twoFactorProvider, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GenerateTwoFactorToken(string userId, string twoFactorProvider, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var user = await FindById(userId, cancellationToken); @@ -1425,7 +1446,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task NotifyTwoFactorToken(TKey userId, string twoFactorProvider, + public virtual async Task NotifyTwoFactorToken(string userId, string twoFactorProvider, string token, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); @@ -1445,9 +1466,9 @@ namespace Microsoft.AspNet.Identity } // IUserFactorStore methods - internal IUserTwoFactorStore GetUserTwoFactorStore() + internal IUserTwoFactorStore GetUserTwoFactorStore() { - var cast = Store as IUserTwoFactorStore; + var cast = Store as IUserTwoFactorStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserTwoFactorStore); @@ -1461,7 +1482,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetTwoFactorEnabled(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetTwoFactorEnabled(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserTwoFactorStore(); @@ -1481,7 +1502,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetTwoFactorEnabled(TKey userId, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SetTwoFactorEnabled(string userId, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserTwoFactorStore(); @@ -1506,7 +1527,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SendEmail(TKey userId, string subject, string body, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SendEmail(string userId, string subject, string body, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); if (EmailService != null) @@ -1528,7 +1549,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SendSms(TKey userId, string message, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SendSms(string userId, string message, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); if (SmsService != null) @@ -1543,9 +1564,9 @@ namespace Microsoft.AspNet.Identity } // IUserLockoutStore methods - internal IUserLockoutStore GetUserLockoutStore() + internal IUserLockoutStore GetUserLockoutStore() { - var cast = Store as IUserLockoutStore; + var cast = Store as IUserLockoutStore; if (cast == null) { throw new NotSupportedException(Resources.StoreNotIUserLockoutStore); @@ -1559,7 +1580,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task IsLockedOut(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task IsLockedOut(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1583,7 +1604,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetLockoutEnabled(TKey userId, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SetLockoutEnabled(string userId, bool enabled, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1602,7 +1623,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetLockoutEnabled(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetLockoutEnabled(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1621,7 +1642,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetLockoutEndDate(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetLockoutEndDate(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1641,7 +1662,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetLockoutEndDate(TKey userId, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task SetLockoutEndDate(string userId, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1667,7 +1688,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task AccessFailed(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task AccessFailed(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1695,7 +1716,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task ResetAccessFailedCount(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task ResetAccessFailedCount(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); @@ -1714,7 +1735,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetAccessFailedCount(TKey userId, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task GetAccessFailedCount(string userId, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); var store = GetUserLockoutStore(); diff --git a/src/Microsoft.AspNet.Identity/UserValidator.cs b/src/Microsoft.AspNet.Identity/UserValidator.cs index 78a1abc05e..70eaf6d055 100644 --- a/src/Microsoft.AspNet.Identity/UserValidator.cs +++ b/src/Microsoft.AspNet.Identity/UserValidator.cs @@ -14,10 +14,7 @@ namespace Microsoft.AspNet.Identity /// Validates users before they are saved /// /// - /// - public class UserValidator : IUserValidator - where TUser : class, IUser - where TKey : IEquatable + public class UserValidator : IUserValidator where TUser : class { /// /// Constructor @@ -44,7 +41,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task Validate(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)) + public virtual async Task Validate(UserManager manager, TUser user, CancellationToken cancellationToken = default(CancellationToken)) { if (manager == null) { @@ -105,29 +102,30 @@ namespace Microsoft.AspNet.Identity return IsUpper(c) || IsLower(c) || IsDigit(c) || c == '@' || c == '_' || c == '.'; } - private async Task ValidateUserName(UserManager manager, TUser user, ICollection errors) + private async Task ValidateUserName(UserManager manager, TUser user, ICollection errors) { - if (string.IsNullOrWhiteSpace(user.UserName)) + var userName = await manager.GetUserName(user); + if (string.IsNullOrWhiteSpace(userName)) { errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "UserName")); } - else if (AllowOnlyAlphanumericUserNames && !user.UserName.All(IsAlphaNumeric)) + else if (AllowOnlyAlphanumericUserNames && !userName.All(IsAlphaNumeric)) { // If any characters are not letters or digits, its an illegal user name - errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidUserName, user.UserName)); + errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidUserName, userName)); } else { - var owner = await manager.FindByName(user.UserName); - if (owner != null && !EqualityComparer.Default.Equals(owner.Id, user.Id)) + var owner = await manager.FindByName(userName); + if (owner != null && !string.Equals(await manager.GetUserId(owner), await manager.GetUserId(user))) { - errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, user.UserName)); + errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, userName)); } } } // make sure email is not empty, valid, and unique - private static async Task ValidateEmail(UserManager manager, TUser user, List errors) + private static async Task ValidateEmail(UserManager manager, TUser user, List errors) { var email = await manager.GetEmailStore().GetEmail(user); if (string.IsNullOrWhiteSpace(email)) @@ -147,7 +145,7 @@ namespace Microsoft.AspNet.Identity } #endif var owner = await manager.FindByEmail(email); - if (owner != null && !EqualityComparer.Default.Equals(owner.Id, user.Id)) + if (owner != null && !string.Equals(await manager.GetUserId(owner), await manager.GetUserId(user))) { errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateEmail, email)); } diff --git a/test/Microsoft.AspNet.Identity.Entity.Test/UserStoreTest.cs b/test/Microsoft.AspNet.Identity.Entity.Test/UserStoreTest.cs index 0216d30601..e862296872 100644 --- a/test/Microsoft.AspNet.Identity.Entity.Test/UserStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.Entity.Test/UserStoreTest.cs @@ -1,1624 +1,1624 @@ -using Microsoft.AspNet.DependencyInjection.Fallback; -using Microsoft.AspNet.Testing; -using Microsoft.Data.Entity; -using Microsoft.Data.Entity.Metadata; -using Microsoft.Data.Entity.Storage; -using Microsoft.Data.InMemory; -using System; -using System.Linq; -using System.Security.Claims; -using System.Threading; -using System.Threading.Tasks; -using Xunit; - -namespace Microsoft.AspNet.Identity.Entity.Test -{ - public class UserStoreTest - { - [Fact] - public async Task Can_share_instance_between_contexts_with_sugar_experience2() - { - using (var db = new IdentityContext()) - { - db.Users.Add(new IdentityUser { UserName = "John Doe" }); - await db.SaveChangesAsync(); - } - - using (var db = new IdentityContext()) - { - var data = db.Users.ToList(); - Assert.Equal(1, data.Count); - Assert.Equal("John Doe", data[0].UserName); - } - } - - [Fact] - public async Task Can_share_instance_between_contexts_with_sugar_experience() - { - using (var db = new SimpleContext()) - { - db.Artists.Add(new SimpleContext.Artist { Name = "John Doe" }); - await db.SaveChangesAsync(); - } - - using (var db = new SimpleContext()) - { - var data = db.Artists.ToList(); - Assert.Equal(1, data.Count); - Assert.Equal("John Doe", data[0].Name); - } - } - - [Fact] - public async Task Can_create_two_artists() - { - using (var db = new SimpleContext()) - { - db.Artists.Add(new SimpleContext.Artist { Name = "John Doe", ArtistId = Guid.NewGuid().ToString() }); - await db.SaveChangesAsync(); - db.Artists.Add(new SimpleContext.Artist { Name = "Second guy", ArtistId = Guid.NewGuid().ToString() }); - await db.SaveChangesAsync(); - } - } - - private class SimpleContext : EntityContext - { - public EntitySet Artists { get; set; } - - protected override void OnConfiguring(EntityConfigurationBuilder builder) - { - builder.UseDataStore(new InMemoryDataStore()); - } - - protected override void OnModelCreating(ModelBuilder builder) - { - builder.Entity().Key(a => a.ArtistId); - } - - public class Artist// : ArtistBase - { - public string ArtistId { get; set; } - public string Name { get; set; } - } - - public class ArtistBase - { - public TKey ArtistId { get; set; } - public string Name { get; set; } - } - } - - [Fact] - public async Task Foo() - { - using (var db = new IdentityContext()) - { - db.Users.Add(new IdentityUser("A")); - await db.SaveChangesAsync(); - } - - using (var db = new IdentityContext()) - { - var data = db.Users.ToList(); - Assert.Equal(1, data.Count); - Assert.Equal("A", data[0].UserName); - } - } - - [Fact] - public async Task CanDeleteUser() - { - var manager = CreateManager(); - var user = new IdentityUser("Delete"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await manager.Delete(user)); - Assert.Null(await manager.FindById(user.Id)); - } - - //[Fact] - //public async Task CanUpdateUserName() - //{ - // var manager = CreateManager(); - // var user = new IdentityUser("Update"); - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // Assert.Null(await manager.FindByName("New")); - // user.UserName = "New"; - // IdentityResultAssert.IsSuccess(await manager.Update(user)); - // Assert.NotNull(await manager.FindByName("New")); - // Assert.Null(await manager.FindByName("Update")); - //} - - [Fact] - public async Task UserValidatorCanBlockCreate() - { - var manager = CreateManager(); - var user = new IdentityUser("CreateBlocked"); - manager.UserValidator = new AlwaysBadValidator(); - IdentityResultAssert.IsFailure(await manager.Create(user), AlwaysBadValidator.ErrorMessage); - } - - //[Fact] - //public async Task UserValidatorCanBlockUpdate() - //{ - // var manager = CreateManager(); - // var user = new IdentityUser("UpdateBlocked"); - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // manager.UserValidator = new AlwaysBadValidator(); - // IdentityResultAssert.IsFailure(await manager.Update(user), AlwaysBadValidator.ErrorMessage); - //} - - // [Theory] - // [InlineData("")] - // [InlineData(null)] - // public async Task UserValidatorBlocksShortEmailsWhenRequiresUniqueEmail(string email) - // { - // var manager = CreateManager(); - // var user = new IdentityUser("UpdateBlocked") {Email = email}; - // manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; - // IdentityResultAssert.IsFailure(await manager.Create(user), "Email cannot be null or empty."); - // } - - //#if NET45 - // [Theory] - // [InlineData("@@afd")] - // [InlineData("bogus")] - // public async Task UserValidatorBlocksInvalidEmailsWhenRequiresUniqueEmail(string email) - // { - // var manager = CreateManager(); - // var user = new IdentityUser("UpdateBlocked") {Email = email}; - // manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; - // IdentityResultAssert.IsFailure(await manager.Create(user), "Email '" + email + "' is invalid."); - // } - //#endif - - // [Fact] - // public async Task PasswordValidatorCanBlockAddPassword() - // { - // var manager = CreateManager(); - // var user = new IdentityUser("AddPasswordBlocked"); - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // manager.PasswordValidator = new AlwaysBadValidator(); - // IdentityResultAssert.IsFailure(await manager.AddPassword(user.Id, "password"), - // AlwaysBadValidator.ErrorMessage); - // } - - [Fact] - public async Task PasswordValidatorCanBlockChangePassword() - { - var manager = CreateManager(); - var user = new IdentityUser("ChangePasswordBlocked"); - IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); - manager.PasswordValidator = new AlwaysBadValidator(); - IdentityResultAssert.IsFailure(await manager.ChangePassword(user.Id, "password", "new"), - AlwaysBadValidator.ErrorMessage); - } - - [Fact] - public async Task CanCreateUserNoPassword() - { - var manager = CreateManager(); - IdentityResultAssert.IsSuccess(await manager.Create(new IdentityUser("CreateUserTest"))); - var user = await manager.FindByName("CreateUserTest"); - Assert.NotNull(user); - Assert.Null(user.PasswordHash); - var logins = await manager.GetLogins(user.Id); - Assert.NotNull(logins); - Assert.Equal(0, logins.Count()); - } - - [Fact] - public async Task CanCreateUserAddLogin() - { - var manager = CreateManager(); - const string userName = "CreateExternalUserTest"; - const string provider = "ZzAuth"; - const string providerKey = "HaoKey"; - IdentityResultAssert.IsSuccess(await manager.Create(new IdentityUser(userName))); - var user = await manager.FindByName(userName); - Assert.NotNull(user); - var login = new UserLoginInfo(provider, providerKey); - IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); - var logins = await manager.GetLogins(user.Id); - Assert.NotNull(logins); - Assert.Equal(1, logins.Count()); - Assert.Equal(provider, logins.First().LoginProvider); - Assert.Equal(providerKey, logins.First().ProviderKey); - } - - [Fact] - public async Task CanCreateUserLoginAndAddPassword() - { - var manager = CreateManager(); - var login = new UserLoginInfo("Provider", "key"); - var user = new IdentityUser("CreateUserLoginAddPasswordTest"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); - Assert.False(await manager.HasPassword(user.Id)); - IdentityResultAssert.IsSuccess(await manager.AddPassword(user.Id, "password")); - Assert.True(await manager.HasPassword(user.Id)); - var logins = await manager.GetLogins(user.Id); - Assert.NotNull(logins); - Assert.Equal(1, logins.Count()); - Assert.Equal(user, await manager.Find(login)); - Assert.Equal(user, await manager.Find(user.UserName, "password")); - } - - [Fact] - public async Task AddPasswordFailsIfAlreadyHave() - { - var manager = CreateManager(); - var user = new IdentityUser("CannotAddAnotherPassword"); - IdentityResultAssert.IsSuccess(await manager.Create(user, "Password")); - Assert.True(await manager.HasPassword(user.Id)); - IdentityResultAssert.IsFailure(await manager.AddPassword(user.Id, "password"), - "User already has a password set."); - } - - [Fact] - public async Task CanCreateUserAddRemoveLogin() - { - var manager = CreateManager(); - var user = new IdentityUser("CreateUserAddRemoveLoginTest"); - var login = new UserLoginInfo("Provider", "key"); - var result = await manager.Create(user); - Assert.NotNull(user); - IdentityResultAssert.IsSuccess(result); - IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); - Assert.Equal(user, await manager.Find(login)); - var logins = await manager.GetLogins(user.Id); - Assert.NotNull(logins); - Assert.Equal(1, logins.Count()); - Assert.Equal(login.LoginProvider, logins.Last().LoginProvider); - Assert.Equal(login.ProviderKey, logins.Last().ProviderKey); - var stamp = user.SecurityStamp; - IdentityResultAssert.IsSuccess(await manager.RemoveLogin(user.Id, login)); - Assert.Null(await manager.Find(login)); - logins = await manager.GetLogins(user.Id); - Assert.NotNull(logins); - Assert.Equal(0, logins.Count()); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanRemovePassword() - { - var manager = CreateManager(); - var user = new IdentityUser("RemovePasswordTest"); - const string password = "password"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - var stamp = user.SecurityStamp; - IdentityResultAssert.IsSuccess(await manager.RemovePassword(user.Id)); - var u = await manager.FindByName(user.UserName); - Assert.NotNull(u); - Assert.Null(u.PasswordHash); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanChangePassword() - { - var manager = CreateManager(); - var user = new IdentityUser("ChangePasswordTest"); - const string password = "password"; - const string newPassword = "newpassword"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - Assert.Equal(manager.Users.Count(), 1); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - IdentityResultAssert.IsSuccess(await manager.ChangePassword(user.Id, password, newPassword)); - Assert.Null(await manager.Find(user.UserName, password)); - Assert.Equal(user, await manager.Find(user.UserName, newPassword)); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanAddRemoveUserClaim() - { - var manager = CreateManager(); - var user = new IdentityUser("ClaimsAddRemove"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - Claim[] claims = { new Claim("c", "v"), new Claim("c2", "v2"), new Claim("c2", "v3") }; - foreach (var c in claims) - { - IdentityResultAssert.IsSuccess(await manager.AddClaim(user.Id, c)); - } - var userClaims = await manager.GetClaims(user.Id); - Assert.Equal(3, userClaims.Count); - IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[0])); - userClaims = await manager.GetClaims(user.Id); - Assert.Equal(2, userClaims.Count); - IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[1])); - userClaims = await manager.GetClaims(user.Id); - Assert.Equal(1, userClaims.Count); - IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[2])); - userClaims = await manager.GetClaims(user.Id); - Assert.Equal(0, userClaims.Count); - } - - [Fact] - public async Task ChangePasswordFallsIfPasswordWrong() - { - var manager = CreateManager(); - var user = new IdentityUser("user"); - IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); - var result = await manager.ChangePassword(user.Id, "bogus", "newpassword"); - IdentityResultAssert.IsFailure(result, "Incorrect password."); - } - - [Fact] - public async Task AddDupeUserNameFails() - { - var manager = CreateManager(); - var user = new IdentityUser("dupe"); - var user2 = new IdentityUser("dupe"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsFailure(await manager.Create(user2), "Name dupe is already taken."); - } - - [Fact] - public async Task AddDupeEmailAllowedByDefault() - { - var manager = CreateManager(); - var user = new IdentityUser("dupe") { Email = "yup@yup.com" }; - var user2 = new IdentityUser("dupeEmail") { Email = "yup@yup.com" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await manager.Create(user2)); - } - - [Fact] - public async Task AddDupeEmailFallsWhenUniqueEmailRequired() - { - var manager = CreateManager(); - manager.UserValidator = new UserValidator { RequireUniqueEmail = true }; - var user = new IdentityUser("dupe") { Email = "yup@yup.com" }; - var user2 = new IdentityUser("dupeEmail") { Email = "yup@yup.com" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsFailure(await manager.Create(user2), "Email 'yup@yup.com' is already taken."); - } - - [Fact] - public async Task UpdateSecurityStampActuallyChanges() - { - var manager = CreateManager(); - var user = new IdentityUser("stampMe"); - Assert.Null(user.SecurityStamp); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task AddDupeLoginFails() - { - var manager = CreateManager(); - var user = new IdentityUser("DupeLogin"); - var login = new UserLoginInfo("provder", "key"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); - var result = await manager.AddLogin(user.Id, login); - IdentityResultAssert.IsFailure(result, "A user with that external login already exists."); - } - - // Email tests - [Fact] - public async Task CanFindByEmail() - { - var manager = CreateManager(); - const string userName = "EmailTest"; - const string email = "email@test.com"; - var user = new IdentityUser(userName) { Email = email }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var fetch = await manager.FindByEmail(email); - Assert.Equal(user, fetch); - } - - [Fact] - public async Task CanFindUsersViaUserQuerable() - { - var mgr = CreateManager(); - var users = new[] - { - new IdentityUser("user1"), - new IdentityUser("user2"), - new IdentityUser("user3") - }; - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await mgr.Create(u)); - } - var usersQ = mgr.Users; - Assert.Equal(3, usersQ.Count()); - Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user1")); - Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user2")); - Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user3")); - Assert.Null(usersQ.FirstOrDefault(u => u.UserName == "bogus")); - } - - [Fact] - public async Task ClaimsIdentityCreatesExpectedClaims() - { - var context = CreateContext(); - var manager = CreateManager(context); - var role = CreateRoleManager(context); - var user = new IdentityUser("Hao"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await role.Create(new IdentityRole("Admin"))); - IdentityResultAssert.IsSuccess(await role.Create(new IdentityRole("Local"))); - IdentityResultAssert.IsSuccess(await manager.AddToRole(user.Id, "Admin")); - IdentityResultAssert.IsSuccess(await manager.AddToRole(user.Id, "Local")); - Claim[] userClaims = - { - new Claim("Whatever", "Value"), - new Claim("Whatever2", "Value2") - }; - foreach (var c in userClaims) - { - IdentityResultAssert.IsSuccess(await manager.AddClaim(user.Id, c)); - } - - var identity = await manager.CreateIdentity(user, "test"); - var claimsFactory = manager.ClaimsIdentityFactory as ClaimsIdentityFactory; - Assert.NotNull(claimsFactory); - var claims = identity.Claims; - Assert.NotNull(claims); - Assert.True( - claims.Any(c => c.Type == claimsFactory.UserNameClaimType && c.Value == user.UserName)); - Assert.True(claims.Any(c => c.Type == claimsFactory.UserIdClaimType && c.Value == user.Id)); - Assert.True(claims.Any(c => c.Type == claimsFactory.RoleClaimType && c.Value == "Admin")); - Assert.True(claims.Any(c => c.Type == claimsFactory.RoleClaimType && c.Value == "Local")); - foreach (var cl in userClaims) - { - Assert.True(claims.Any(c => c.Type == cl.Type && c.Value == cl.Value)); - } - } - - [Fact] - public async Task ConfirmEmailFalseByDefaultTest() - { - var manager = CreateManager(); - var user = new IdentityUser("test"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - Assert.False(await manager.IsEmailConfirmed(user.Id)); - } - - // TODO: No token provider implementations yet - private class StaticTokenProvider : IUserTokenProvider - { - public Task Generate(string purpose, UserManager manager, - IdentityUser user, CancellationToken token) - { - return Task.FromResult(MakeToken(purpose, user)); - } - - public Task Validate(string purpose, string token, UserManager manager, - IdentityUser user, CancellationToken cancellationToken) - { - return Task.FromResult(token == MakeToken(purpose, user)); - } - - public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) - { - return Task.FromResult(0); - } - - public Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) - { - return Task.FromResult(true); - } - - private static string MakeToken(string purpose, IUser user) - { - return string.Join(":", user.Id, purpose, "ImmaToken"); - } - } - - [Fact] - public async Task CanResetPasswordWithStaticTokenProvider() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("ResetPasswordTest"); - const string password = "password"; - const string newPassword = "newpassword"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GeneratePasswordResetToken(user.Id); - Assert.NotNull(token); - IdentityResultAssert.IsSuccess(await manager.ResetPassword(user.Id, token, newPassword)); - Assert.Null(await manager.Find(user.UserName, password)); - Assert.Equal(user, await manager.Find(user.UserName, newPassword)); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task PasswordValidatorCanBlockResetPasswordWithStaticTokenProvider() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("ResetPasswordTest"); - const string password = "password"; - const string newPassword = "newpassword"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GeneratePasswordResetToken(user.Id); - Assert.NotNull(token); - manager.PasswordValidator = new AlwaysBadValidator(); - IdentityResultAssert.IsFailure(await manager.ResetPassword(user.Id, token, newPassword), - AlwaysBadValidator.ErrorMessage); - Assert.NotNull(await manager.Find(user.UserName, password)); - Assert.Equal(user, await manager.Find(user.UserName, password)); - Assert.Equal(stamp, user.SecurityStamp); - } - - [Fact] - public async Task ResetPasswordWithStaticTokenProviderFailsWithWrongToken() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("ResetPasswordTest"); - const string password = "password"; - const string newPassword = "newpassword"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - IdentityResultAssert.IsFailure(await manager.ResetPassword(user.Id, "bogus", newPassword), "Invalid token."); - Assert.NotNull(await manager.Find(user.UserName, password)); - Assert.Equal(user, await manager.Find(user.UserName, password)); - Assert.Equal(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanGenerateAndVerifyUserTokenWithStaticTokenProvider() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("UserTokenTest"); - var user2 = new IdentityUser("UserTokenTest2"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsSuccess(await manager.Create(user2)); - var token = await manager.GenerateUserToken("test", user.Id); - Assert.True(await manager.VerifyUserToken(user.Id, "test", token)); - Assert.False(await manager.VerifyUserToken(user.Id, "test2", token)); - Assert.False(await manager.VerifyUserToken(user.Id, "test", token + "a")); - Assert.False(await manager.VerifyUserToken(user2.Id, "test", token)); - } - - [Fact] - public async Task CanConfirmEmailWithStaticToken() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("test"); - Assert.False(user.EmailConfirmed); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var token = await manager.GenerateEmailConfirmationToken(user.Id); - Assert.NotNull(token); - IdentityResultAssert.IsSuccess(await manager.ConfirmEmail(user.Id, token)); - Assert.True(await manager.IsEmailConfirmed(user.Id)); - IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, null)); - Assert.False(await manager.IsEmailConfirmed(user.Id)); - } - - [Fact] - public async Task ConfirmEmailWithStaticTokenFailsWithWrongToken() - { - var manager = CreateManager(); - manager.UserTokenProvider = new StaticTokenProvider(); - var user = new IdentityUser("test"); - Assert.False(user.EmailConfirmed); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - IdentityResultAssert.IsFailure(await manager.ConfirmEmail(user.Id, "bogus"), "Invalid token."); - Assert.False(await manager.IsEmailConfirmed(user.Id)); - } - - // TODO: Can't reenable til we have a SecurityStamp linked token provider - //[Fact] - //public async Task ConfirmTokenFailsAfterPasswordChange() - //{ - // var manager = CreateManager(); - // var user = new IdentityUser("test"); - // Assert.False(user.EmailConfirmed); - // IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); - // var token = await manager.GenerateEmailConfirmationToken(user.Id); - // Assert.NotNull(token); - // IdentityResultAssert.IsSuccess(await manager.ChangePassword(user.Id, "password", "newpassword")); - // IdentityResultAssert.IsFailure(await manager.ConfirmEmail(user.Id, token), "Invalid token."); - // Assert.False(await manager.IsEmailConfirmed(user.Id)); - //} - - // Lockout tests - - [Fact] - public async Task SingleFailureLockout() - { - var mgr = CreateManager(); - mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("fastLockout"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.False(await mgr.IsLockedOut(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.True(await mgr.IsLockedOut(user.Id)); - Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); - } - - [Fact] - public async Task TwoFailureLockout() - { - var mgr = CreateManager(); - mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); - mgr.UserLockoutEnabledByDefault = true; - mgr.MaxFailedAccessAttemptsBeforeLockout = 2; - var user = new IdentityUser("twoFailureLockout"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.False(await mgr.IsLockedOut(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.True(await mgr.IsLockedOut(user.Id)); - Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); - } - - [Fact] - public async Task ResetAccessCountPreventsLockout() - { - var mgr = CreateManager(); - mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); - mgr.UserLockoutEnabledByDefault = true; - mgr.MaxFailedAccessAttemptsBeforeLockout = 2; - var user = new IdentityUser("resetLockout"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.False(await mgr.IsLockedOut(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.ResetAccessFailedCount(user.Id)); - Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); - } - - [Fact] - public async Task CanEnableLockoutManuallyAndLockout() - { - var mgr = CreateManager(); - mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); - mgr.MaxFailedAccessAttemptsBeforeLockout = 2; - var user = new IdentityUser("manualLockout"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.False(await mgr.GetLockoutEnabled(user.Id)); - Assert.False(user.LockoutEnabled); - IdentityResultAssert.IsSuccess(await mgr.SetLockoutEnabled(user.Id, true)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.False(await mgr.IsLockedOut(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); - IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); - Assert.True(await mgr.IsLockedOut(user.Id)); - Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); - Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); - } - - [Fact] - public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate() - { - var mgr = CreateManager(); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("LockoutTest"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, new DateTimeOffset())); - Assert.False(await mgr.IsLockedOut(user.Id)); - Assert.Equal(new DateTimeOffset(), await mgr.GetLockoutEndDate(user.Id)); - Assert.Null(user.LockoutEndDateUtc); - } - - [Fact] - public async Task LockoutFailsIfNotEnabled() - { - var mgr = CreateManager(); - var user = new IdentityUser("LockoutNotEnabledTest"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.False(await mgr.GetLockoutEnabled(user.Id)); - Assert.False(user.LockoutEnabled); - IdentityResultAssert.IsFailure(await mgr.SetLockoutEndDate(user.Id, new DateTimeOffset()), - "Lockout is not enabled for this user."); - Assert.False(await mgr.IsLockedOut(user.Id)); - } - - [Fact] - public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut() - { - var mgr = CreateManager(); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("LockoutUtcNowTest") { LockoutEndDateUtc = DateTime.UtcNow.AddSeconds(-1) }; - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.False(await mgr.IsLockedOut(user.Id)); - } - - [Fact] - public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut() - { - var mgr = CreateManager(); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("LockoutUtcNowTest"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, DateTimeOffset.UtcNow.AddSeconds(-1))); - Assert.False(await mgr.IsLockedOut(user.Id)); - } - - [Fact] - public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut() - { - var mgr = CreateManager(); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("LockoutUtcNowTest") { LockoutEndDateUtc = DateTime.UtcNow.AddMinutes(5) }; - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - Assert.True(await mgr.IsLockedOut(user.Id)); - } - - [Fact] - public async Task UserLockedOutWithDateTimeLocalKindNowPlus30() - { - var mgr = CreateManager(); - mgr.UserLockoutEnabledByDefault = true; - var user = new IdentityUser("LockoutTest"); - IdentityResultAssert.IsSuccess(await mgr.Create(user)); - Assert.True(await mgr.GetLockoutEnabled(user.Id)); - Assert.True(user.LockoutEnabled); - var lockoutEnd = new DateTimeOffset(DateTime.Now.AddMinutes(30).ToLocalTime()); - IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, lockoutEnd)); - Assert.True(await mgr.IsLockedOut(user.Id)); - var end = await mgr.GetLockoutEndDate(user.Id); - Assert.Equal(lockoutEnd, end); - } - - // Role Tests - [Fact] - public async Task CanCreateRoleTest() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("create"); - Assert.False(await manager.RoleExists(role.Name)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - Assert.True(await manager.RoleExists(role.Name)); - } - - private class AlwaysBadValidator : IUserValidator, IRoleValidator, - IPasswordValidator - { - public const string ErrorMessage = "I'm Bad."; - - public Task Validate(string password, CancellationToken token) - { - return Task.FromResult(IdentityResult.Failed(ErrorMessage)); - } - - public Task Validate(RoleManager manager, IdentityRole role, CancellationToken token) - { - return Task.FromResult(IdentityResult.Failed(ErrorMessage)); - } - - public Task Validate(UserManager manager, IdentityUser user, CancellationToken token) - { - return Task.FromResult(IdentityResult.Failed(ErrorMessage)); - } - } - - [Fact] - public async Task BadValidatorBlocksCreateRole() - { - var manager = CreateRoleManager(); - manager.RoleValidator = new AlwaysBadValidator(); - IdentityResultAssert.IsFailure(await manager.Create(new IdentityRole("blocked")), - AlwaysBadValidator.ErrorMessage); - } - - [Fact] - public async Task BadValidatorBlocksRoleUpdate() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("poorguy"); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - var error = AlwaysBadValidator.ErrorMessage; - manager.RoleValidator = new AlwaysBadValidator(); - IdentityResultAssert.IsFailure(await manager.Update(role), error); - } - - [Fact] - public async Task CanDeleteRoleTest() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("delete"); - Assert.False(await manager.RoleExists(role.Name)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - IdentityResultAssert.IsSuccess(await manager.Delete(role)); - Assert.False(await manager.RoleExists(role.Name)); - } - - [Fact] - public async Task CanRoleFindByIdTest() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("FindById"); - Assert.Null(await manager.FindById(role.Id)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - Assert.Equal(role, await manager.FindById(role.Id)); - } - - [Fact] - public async Task CanRoleFindByName() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("FindByName"); - Assert.Null(await manager.FindByName(role.Name)); - Assert.False(await manager.RoleExists(role.Name)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - Assert.Equal(role, await manager.FindByName(role.Name)); - } - - [Fact] - public async Task CanUpdateRoleNameTest() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("update"); - Assert.False(await manager.RoleExists(role.Name)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - Assert.True(await manager.RoleExists(role.Name)); - role.Name = "Changed"; - IdentityResultAssert.IsSuccess(await manager.Update(role)); - Assert.False(await manager.RoleExists("update")); - Assert.Equal(role, await manager.FindByName(role.Name)); - } - - [Fact] - public async Task CanQuerableRolesTest() - { - var manager = CreateRoleManager(); - IdentityRole[] roles = - { - new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), - new IdentityRole("r4") - }; - foreach (var r in roles) - { - IdentityResultAssert.IsSuccess(await manager.Create(r)); - } - Assert.Equal(roles.Length, manager.Roles.Count()); - var r1 = manager.Roles.FirstOrDefault(r => r.Name == "r1"); - Assert.Equal(roles[0], r1); - } - - //[Fact] - //public async Task DeleteRoleNonEmptySucceedsTest() - //{ - // // Need fail if not empty? - // var userMgr = CreateManager(); - // var roleMgr = CreateRoleManager(); - // var role = new IdentityRole("deleteNonEmpty"); - // Assert.False(await roleMgr.RoleExists(role.Name)); - // IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - // var user = new IdentityUser("t"); - // IdentityResultAssert.IsSuccess(await userMgr.Create(user)); - // IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); - // IdentityResultAssert.IsSuccess(await roleMgr.Delete(role)); - // Assert.Null(await roleMgr.FindByName(role.Name)); - // Assert.False(await roleMgr.RoleExists(role.Name)); - // // REVIEW: We should throw if deleteing a non empty role? - // var roles = await userMgr.GetRoles(user.Id); - - // // In memory this doesn't work since there's no concept of cascading deletes - // //Assert.Equal(0, roles.Count()); - //} - - ////[Fact] - ////public async Task DeleteUserRemovesFromRoleTest() - ////{ - //// // Need fail if not empty? - //// var userMgr = CreateManager(); - //// var roleMgr = CreateRoleManager(); - //// var role = new IdentityRole("deleteNonEmpty"); - //// Assert.False(await roleMgr.RoleExists(role.Name)); - //// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - //// var user = new IdentityUser("t"); - //// IdentityResultAssert.IsSuccess(await userMgr.Create(user)); - //// IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); - //// IdentityResultAssert.IsSuccess(await userMgr.Delete(user)); - //// role = roleMgr.FindById(role.Id); - ////} - - [Fact] - public async Task CreateRoleFailsIfExists() - { - var manager = CreateRoleManager(); - var role = new IdentityRole("dupeRole"); - Assert.False(await manager.RoleExists(role.Name)); - IdentityResultAssert.IsSuccess(await manager.Create(role)); - Assert.True(await manager.RoleExists(role.Name)); - var role2 = new IdentityRole("dupeRole"); - IdentityResultAssert.IsFailure(await manager.Create(role2)); - } - - [Fact] - public async Task CanAddUsersToRole() - { - var context = CreateContext(); - var manager = CreateManager(context); - var roleManager = CreateRoleManager(context); - var role = new IdentityRole("addUserTest"); - IdentityResultAssert.IsSuccess(await roleManager.Create(role)); - IdentityUser[] users = - { - new IdentityUser("1"), new IdentityUser("2"), new IdentityUser("3"), - new IdentityUser("4") - }; - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await manager.Create(u)); - IdentityResultAssert.IsSuccess(await manager.AddToRole(u.Id, role.Name)); - Assert.True(await manager.IsInRole(u.Id, role.Name)); - } - } - - [Fact] - public async Task CanGetRolesForUser() - { - var context = CreateContext(); - var userManager = CreateManager(context); - var roleManager = CreateRoleManager(context); - IdentityUser[] users = - { - new IdentityUser("u1"), new IdentityUser("u2"), new IdentityUser("u3"), - new IdentityUser("u4") - }; - IdentityRole[] roles = - { - new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), - new IdentityRole("r4") - }; - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await userManager.Create(u)); - } - foreach (var r in roles) - { - IdentityResultAssert.IsSuccess(await roleManager.Create(r)); - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await userManager.AddToRole(u.Id, r.Name)); - Assert.True(await userManager.IsInRole(u.Id, r.Name)); - } - } - - foreach (var u in users) - { - var rs = await userManager.GetRoles(u.Id); - Assert.Equal(roles.Length, rs.Count); - foreach (var r in roles) - { - Assert.True(rs.Any(role => role == r.Name)); - } - } - } - - - [Fact] - public async Task RemoveUserFromRoleWithMultipleRoles() - { - var context = CreateContext(); - var userManager = CreateManager(context); - var roleManager = CreateRoleManager(context); - var user = new IdentityUser("MultiRoleUser"); - IdentityResultAssert.IsSuccess(await userManager.Create(user)); - IdentityRole[] roles = - { - new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), - new IdentityRole("r4") - }; - foreach (var r in roles) - { - IdentityResultAssert.IsSuccess(await roleManager.Create(r)); - IdentityResultAssert.IsSuccess(await userManager.AddToRole(user.Id, r.Name)); - Assert.True(await userManager.IsInRole(user.Id, r.Name)); - } - IdentityResultAssert.IsSuccess(await userManager.RemoveFromRole(user.Id, roles[2].Name)); - Assert.False(await userManager.IsInRole(user.Id, roles[2].Name)); - } - - [Fact] - public async Task CanRemoveUsersFromRole() - { - var context = CreateContext(); - var userManager = CreateManager(context); - var roleManager = CreateRoleManager(context); - IdentityUser[] users = - { - new IdentityUser("1"), new IdentityUser("2"), new IdentityUser("3"), - new IdentityUser("4") - }; - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await userManager.Create(u)); - } - var r = new IdentityRole("r1"); - IdentityResultAssert.IsSuccess(await roleManager.Create(r)); - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await userManager.AddToRole(u.Id, r.Name)); - Assert.True(await userManager.IsInRole(u.Id, r.Name)); - } - foreach (var u in users) - { - IdentityResultAssert.IsSuccess(await userManager.RemoveFromRole(u.Id, r.Name)); - Assert.False(await userManager.IsInRole(u.Id, r.Name)); - } - } - - [Fact] - public async Task RemoveUserNotInRoleFails() - { - var context = CreateContext(); - var userMgr = CreateManager(context); - var roleMgr = CreateRoleManager(context); - var role = new IdentityRole("addUserDupeTest"); - var user = new IdentityUser("user1"); - IdentityResultAssert.IsSuccess(await userMgr.Create(user)); - IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - var result = await userMgr.RemoveFromRole(user.Id, role.Name); - IdentityResultAssert.IsFailure(result, "User is not in role."); - } - - [Fact] - public async Task AddUserToRoleFailsIfAlreadyInRole() - { - var context = CreateContext(); - var userMgr = CreateManager(context); - var roleMgr = CreateRoleManager(context); - var role = new IdentityRole("addUserDupeTest"); - var user = new IdentityUser("user1"); - IdentityResultAssert.IsSuccess(await userMgr.Create(user)); - IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); - Assert.True(await userMgr.IsInRole(user.Id, role.Name)); - IdentityResultAssert.IsFailure(await userMgr.AddToRole(user.Id, role.Name), "User already in role."); - } - - [Fact] - public async Task CanFindRoleByNameWithManager() - { - var roleMgr = CreateRoleManager(); - var role = new IdentityRole("findRoleByNameTest"); - IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - Assert.Equal(role.Id, (await roleMgr.FindByName(role.Name)).Id); - } - - [Fact] - public async Task CanFindRoleWithManager() - { - var roleMgr = CreateRoleManager(); - var role = new IdentityRole("findRoleTest"); - IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); - Assert.Equal(role, await roleMgr.FindById(role.Id)); - } - - [Fact] - public async Task SetPhoneNumberTest() - { - var manager = CreateManager(); - var userName = "PhoneTest"; - var user = new IdentityUser(userName); - user.PhoneNumber = "123-456-7890"; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var stamp = await manager.GetSecurityStamp(user.Id); - Assert.Equal(await manager.GetPhoneNumber(user.Id), "123-456-7890"); - IdentityResultAssert.IsSuccess(await manager.SetPhoneNumber(user.Id, "111-111-1111")); - Assert.Equal(await manager.GetPhoneNumber(user.Id), "111-111-1111"); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanChangePhoneNumber() - { - var manager = CreateManager(); - const string userName = "PhoneTest"; - var user = new IdentityUser(userName) { PhoneNumber = "123-456-7890" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); - var stamp = await manager.GetSecurityStamp(user.Id); - var token1 = await manager.GenerateChangePhoneNumberToken(user.Id, "111-111-1111"); - IdentityResultAssert.IsSuccess(await manager.ChangePhoneNumber(user.Id, "111-111-1111", token1)); - Assert.True(await manager.IsPhoneNumberConfirmed(user.Id)); - Assert.Equal(await manager.GetPhoneNumber(user.Id), "111-111-1111"); - Assert.NotEqual(stamp, user.SecurityStamp); - } - - [Fact] - public async Task ChangePhoneNumberFailsWithWrongToken() - { - var manager = CreateManager(); - const string userName = "PhoneTest"; - var user = new IdentityUser(userName) { PhoneNumber = "123-456-7890" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); - var stamp = await manager.GetSecurityStamp(user.Id); - IdentityResultAssert.IsFailure(await manager.ChangePhoneNumber(user.Id, "111-111-1111", "bogus"), - "Invalid token."); - Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); - Assert.Equal(await manager.GetPhoneNumber(user.Id), "123-456-7890"); - Assert.Equal(stamp, user.SecurityStamp); - } - - [Fact] - public async Task CanVerifyPhoneNumber() - { - var manager = CreateManager(); - const string userName = "VerifyPhoneTest"; - var user = new IdentityUser(userName); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - const string num1 = "111-123-4567"; - const string num2 = "111-111-1111"; - var token1 = await manager.GenerateChangePhoneNumberToken(user.Id, num1); - var token2 = await manager.GenerateChangePhoneNumberToken(user.Id, num2); - Assert.NotEqual(token1, token2); - Assert.True(await manager.VerifyChangePhoneNumberToken(user.Id, token1, num1)); - Assert.True(await manager.VerifyChangePhoneNumberToken(user.Id, token2, num2)); - Assert.False(await manager.VerifyChangePhoneNumberToken(user.Id, token2, num1)); - Assert.False(await manager.VerifyChangePhoneNumberToken(user.Id, token1, num2)); - } - - private class EmailTokenProvider : IUserTokenProvider - { - public Task Generate(string purpose, UserManager manager, IdentityUser user, CancellationToken token) - { - return Task.FromResult(MakeToken(purpose)); - } - - public Task Validate(string purpose, string token, UserManager manager, - IdentityUser user, CancellationToken cancellationToken) - { - return Task.FromResult(token == MakeToken(purpose)); - } - - public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) - { - return manager.SendEmail(user.Id, token, token); - } - - public async Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) - { - return !string.IsNullOrEmpty(await manager.GetEmail(user.Id)); - } - - private static string MakeToken(string purpose) - { - return "email:" + purpose; - } - } - - private class SmsTokenProvider : IUserTokenProvider - { - public Task Generate(string purpose, UserManager manager, IdentityUser user, CancellationToken token) - { - return Task.FromResult(MakeToken(purpose)); - } - - public Task Validate(string purpose, string token, UserManager manager, - IdentityUser user, CancellationToken cancellationToken) - { - return Task.FromResult(token == MakeToken(purpose)); - } - - public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) - { - return manager.SendSms(user.Id, token); - } - - public async Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) - { - return !string.IsNullOrEmpty(await manager.GetPhoneNumber(user.Id)); - } - - private static string MakeToken(string purpose) - { - return "sms:" + purpose; - } - } - - [Fact] - public async Task CanEmailTwoFactorToken() - { - var manager = CreateManager(); - var messageService = new TestMessageService(); - manager.EmailService = messageService; - const string factorId = "EmailCode"; - manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider()); - var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; - const string password = "password"; - IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - Assert.NotNull(token); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal(token, messageService.Message.Subject); - Assert.Equal(token, messageService.Message.Body); - Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - } - - [Fact] - public async Task NotifyWithUnknownProviderFails() - { - var manager = CreateManager(); - var user = new IdentityUser("NotifyFail"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - await - ExceptionAssert.ThrowsAsync( - async () => await manager.NotifyTwoFactorToken(user.Id, "Bogus", "token"), - "No IUserTwoFactorProvider for 'Bogus' is registered."); - } - - - //[Fact] - //public async Task EmailTokenFactorWithFormatTest() - //{ - // var manager = CreateManager(); - // var messageService = new TestMessageService(); - // manager.EmailService = messageService; - // const string factorId = "EmailCode"; - // manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider - // { - // Subject = "Security Code", - // BodyFormat = "Your code is: {0}" - // }); - // var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; - // const string password = "password"; - // IdentityResultAssert.IsSuccess(await manager.Create(user, password)); - // var stamp = user.SecurityStamp; - // Assert.NotNull(stamp); - // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - // Assert.NotNull(token); - // Assert.Null(messageService.Message); - // IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); - // Assert.NotNull(messageService.Message); - // Assert.Equal("Security Code", messageService.Message.Subject); - // Assert.Equal("Your code is: " + token, messageService.Message.Body); - // Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - //} - - //[Fact] - //public async Task EmailFactorFailsAfterSecurityStampChangeTest() - //{ - // var manager = CreateManager(); - // const string factorId = "EmailCode"; - // manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider()); - // var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // var stamp = user.SecurityStamp; - // Assert.NotNull(stamp); - // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - // Assert.NotNull(token); - // IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); - // Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - //} - - [Fact] - public async Task EnableTwoFactorChangesSecurityStamp() - { - var manager = CreateManager(); - var user = new IdentityUser("TwoFactorEnabledTest"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - IdentityResultAssert.IsSuccess(await manager.SetTwoFactorEnabled(user.Id, true)); - Assert.NotEqual(stamp, await manager.GetSecurityStamp(user.Id)); - Assert.True(await manager.GetTwoFactorEnabled(user.Id)); - } - - [Fact] - public async Task CanSendSms() - { - var manager = CreateManager(); - var messageService = new TestMessageService(); - manager.SmsService = messageService; - var user = new IdentityUser("SmsTest") { PhoneNumber = "4251234567" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - await manager.SendSms(user.Id, "Hi"); - Assert.NotNull(messageService.Message); - Assert.Equal("Hi", messageService.Message.Body); - } - - [Fact] - public async Task CanSendEmail() - { - var manager = CreateManager(); - var messageService = new TestMessageService(); - manager.EmailService = messageService; - var user = new IdentityUser("EmailTest") { Email = "foo@foo.com" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - await manager.SendEmail(user.Id, "Hi", "Body"); - Assert.NotNull(messageService.Message); - Assert.Equal("Hi", messageService.Message.Subject); - Assert.Equal("Body", messageService.Message.Body); - } - - [Fact] - public async Task CanSmsTwoFactorToken() - { - var manager = CreateManager(); - var messageService = new TestMessageService(); - manager.SmsService = messageService; - const string factorId = "PhoneCode"; - manager.RegisterTwoFactorProvider(factorId, new SmsTokenProvider()); - var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var stamp = user.SecurityStamp; - Assert.NotNull(stamp); - var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - Assert.NotNull(token); - Assert.Null(messageService.Message); - IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); - Assert.NotNull(messageService.Message); - Assert.Equal(token, messageService.Message.Body); - Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - } - - //[Fact] - //public async Task PhoneTokenFactorFormatTest() - //{ - // var manager = CreateManager(); - // var messageService = new TestMessageService(); - // manager.SmsService = messageService; - // const string factorId = "PhoneCode"; - // manager.RegisterTwoFactorProvider(factorId, new PhoneNumberTokenProvider - // { - // MessageFormat = "Your code is: {0}" - // }); - // var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // var stamp = user.SecurityStamp; - // Assert.NotNull(stamp); - // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - // Assert.NotNull(token); - // Assert.Null(messageService.Message); - // IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); - // Assert.NotNull(messageService.Message); - // Assert.Equal("Your code is: " + token, messageService.Message.Body); - // Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - //} - - [Fact] - public async Task GenerateTwoFactorWithUnknownFactorProviderWillThrow() - { - var manager = CreateManager(); - var user = new IdentityUser("PhoneCodeTest"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - const string error = "No IUserTwoFactorProvider for 'bogus' is registered."; - await - ExceptionAssert.ThrowsAsync( - () => manager.GenerateTwoFactorToken(user.Id, "bogus"), error); - await ExceptionAssert.ThrowsAsync( - () => manager.VerifyTwoFactorToken(user.Id, "bogus", "bogus"), error); - } - - [Fact] - public async Task GetValidTwoFactorTestEmptyWithNoProviders() - { - var manager = CreateManager(); - var user = new IdentityUser("test"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var factors = await manager.GetValidTwoFactorProviders(user.Id); - Assert.NotNull(factors); - Assert.True(!factors.Any()); - } - - [Fact] - public async Task GetValidTwoFactorTest() - { - var manager = CreateManager(); - manager.RegisterTwoFactorProvider("phone", new SmsTokenProvider()); - manager.RegisterTwoFactorProvider("email", new EmailTokenProvider()); - var user = new IdentityUser("test"); - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var factors = await manager.GetValidTwoFactorProviders(user.Id); - Assert.NotNull(factors); - Assert.True(!factors.Any()); - IdentityResultAssert.IsSuccess(await manager.SetPhoneNumber(user.Id, "111-111-1111")); - factors = await manager.GetValidTwoFactorProviders(user.Id); - Assert.NotNull(factors); - Assert.True(factors.Count() == 1); - Assert.Equal("phone", factors[0]); - IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, "test@test.com")); - factors = await manager.GetValidTwoFactorProviders(user.Id); - Assert.NotNull(factors); - Assert.True(factors.Count() == 2); - IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, null)); - factors = await manager.GetValidTwoFactorProviders(user.Id); - Assert.NotNull(factors); - Assert.True(factors.Count() == 1); - Assert.Equal("phone", factors[0]); - } - - //[Fact] - //public async Task PhoneFactorFailsAfterSecurityStampChangeTest() - //{ - // var manager = CreateManager(); - // var factorId = "PhoneCode"; - // manager.RegisterTwoFactorProvider(factorId, new PhoneNumberTokenProvider()); - // var user = new IdentityUser("PhoneCodeTest"); - // user.PhoneNumber = "4251234567"; - // IdentityResultAssert.IsSuccess(await manager.Create(user)); - // var stamp = user.SecurityStamp; - // Assert.NotNull(stamp); - // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); - // Assert.NotNull(token); - // IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); - // Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); - //} - - [Fact] - public async Task VerifyTokenFromWrongTokenProviderFails() - { - var manager = CreateManager(); - manager.RegisterTwoFactorProvider("PhoneCode", new SmsTokenProvider()); - manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider()); - var user = new IdentityUser("WrongTokenProviderTest") { PhoneNumber = "4251234567" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - var token = await manager.GenerateTwoFactorToken(user.Id, "PhoneCode"); - Assert.NotNull(token); - Assert.False(await manager.VerifyTwoFactorToken(user.Id, "EmailCode", token)); - } - - [Fact] - public async Task VerifyWithWrongSmsTokenFails() - { - var manager = CreateManager(); - const string factorId = "PhoneCode"; - manager.RegisterTwoFactorProvider(factorId, new SmsTokenProvider()); - var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; - IdentityResultAssert.IsSuccess(await manager.Create(user)); - Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, "bogus")); - } - - private class DataStoreConfig : ContextConfiguration - { - private readonly DataStore _store; - - public DataStoreConfig(DataStore store) - { - _store = store; - } - - public override DataStore DataStore - { - get { return _store; } - } - - } - - private static EntityContext CreateContext() - { - var configuration = new EntityConfigurationBuilder() - //.UseModel(model) - .UseDataStore(new InMemoryDataStore()) - .BuildConfiguration(); - - var db = new IdentityContext(configuration); - // var sql = db.Configuration.DataStore as SqlServerDataStore; - // if (sql != null) - // { - //#if NET45 - // var builder = new DbConnectionStringBuilder {ConnectionString = sql.ConnectionString}; - // var targetDatabase = builder["Database"].ToString(); - - // // Connect to master, check if database exists, and create if not - // builder.Add("Database", "master"); - // using (var masterConnection = new SqlConnection(builder.ConnectionString)) - // { - // masterConnection.Open(); - - // var masterCommand = masterConnection.CreateCommand(); - // masterCommand.CommandText = "SELECT COUNT(*) FROM sys.databases WHERE [name]=N'" + targetDatabase + - // "'"; - // if ((int?) masterCommand.ExecuteScalar() < 1) - // { - // masterCommand.CommandText = "CREATE DATABASE [" + targetDatabase + "]"; - // masterCommand.ExecuteNonQuery(); - - // using (var conn = new SqlConnection(sql.ConnectionString)) - // { - // conn.Open(); - // var command = conn.CreateCommand(); - // command.CommandText = @" - //CREATE TABLE [dbo].[AspNetUsers] ( - //[Id] NVARCHAR (128) NOT NULL, - //[Email] NVARCHAR (256) NULL, - //[EmailConfirmed] BIT NOT NULL, - //[PasswordHash] NVARCHAR (MAX) NULL, - //[SecurityStamp] NVARCHAR (MAX) NULL, - //[PhoneNumber] NVARCHAR (MAX) NULL, - //[PhoneNumberConfirmed] BIT NOT NULL, - //[TwoFactorEnabled] BIT NOT NULL, - //[LockoutEndDateUtc] DATETIME NULL, - //[LockoutEnabled] BIT NOT NULL, - //[AccessFailedCount] INT NOT NULL, - //[UserName] NVARCHAR (256) NOT NULL - //) "; - // //CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC) - // command.ExecuteNonQuery(); - // } - // } - // } - //#else - // throw new NotSupportedException("SQL Server is not yet supported when running against K10."); - //#endif - //} - - - // TODO: Create DB? - return db; - } - - - private static UserManager CreateManager(EntityContext context) - { - return new UserManager(new UserStore(context)); - } - - private static UserManager CreateManager() - { - return CreateManager(CreateContext()); - } - - private static RoleManager CreateRoleManager(EntityContext context) - { - return new RoleManager(new RoleStore(context)); - } - - private static RoleManager CreateRoleManager() - { - return CreateRoleManager(CreateContext()); - } - - public class TestMessageService : IIdentityMessageService - { - public IdentityMessage Message { get; set; } - - public Task Send(IdentityMessage message, CancellationToken token) - { - Message = message; - return Task.FromResult(0); - } - } - } -} +//using Microsoft.AspNet.DependencyInjection.Fallback; +//using Microsoft.AspNet.Testing; +//using Microsoft.Data.Entity; +//using Microsoft.Data.Entity.Metadata; +//using Microsoft.Data.Entity.Storage; +//using Microsoft.Data.InMemory; +//using System; +//using System.Linq; +//using System.Security.Claims; +//using System.Threading; +//using System.Threading.Tasks; +//using Xunit; + +//namespace Microsoft.AspNet.Identity.Entity.Test +//{ +// public class UserStoreTest +// { +// [Fact] +// public async Task Can_share_instance_between_contexts_with_sugar_experience2() +// { +// using (var db = new IdentityContext()) +// { +// db.Users.Add(new IdentityUser { UserName = "John Doe" }); +// await db.SaveChangesAsync(); +// } + +// using (var db = new IdentityContext()) +// { +// var data = db.Users.ToList(); +// Assert.Equal(1, data.Count); +// Assert.Equal("John Doe", data[0].UserName); +// } +// } + +// [Fact] +// public async Task Can_share_instance_between_contexts_with_sugar_experience() +// { +// using (var db = new SimpleContext()) +// { +// db.Artists.Add(new SimpleContext.Artist { Name = "John Doe" }); +// await db.SaveChangesAsync(); +// } + +// using (var db = new SimpleContext()) +// { +// var data = db.Artists.ToList(); +// Assert.Equal(1, data.Count); +// Assert.Equal("John Doe", data[0].Name); +// } +// } + +// [Fact] +// public async Task Can_create_two_artists() +// { +// using (var db = new SimpleContext()) +// { +// db.Artists.Add(new SimpleContext.Artist { Name = "John Doe", ArtistId = Guid.NewGuid().ToString() }); +// await db.SaveChangesAsync(); +// db.Artists.Add(new SimpleContext.Artist { Name = "Second guy", ArtistId = Guid.NewGuid().ToString() }); +// await db.SaveChangesAsync(); +// } +// } + +// private class SimpleContext : EntityContext +// { +// public EntitySet Artists { get; set; } + +// protected override void OnConfiguring(EntityConfigurationBuilder builder) +// { +// builder.UseDataStore(new InMemoryDataStore()); +// } + +// protected override void OnModelCreating(ModelBuilder builder) +// { +// builder.Entity().Key(a => a.ArtistId); +// } + +// public class Artist// : ArtistBase +// { +// public string ArtistId { get; set; } +// public string Name { get; set; } +// } + +// public class ArtistBase +// { +// public TKey ArtistId { get; set; } +// public string Name { get; set; } +// } +// } + +// [Fact] +// public async Task Foo() +// { +// using (var db = new IdentityContext()) +// { +// db.Users.Add(new IdentityUser("A")); +// await db.SaveChangesAsync(); +// } + +// using (var db = new IdentityContext()) +// { +// var data = db.Users.ToList(); +// Assert.Equal(1, data.Count); +// Assert.Equal("A", data[0].UserName); +// } +// } + +// [Fact] +// public async Task CanDeleteUser() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("Delete"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await manager.Delete(user)); +// Assert.Null(await manager.FindById(user.Id)); +// } + +// //[Fact] +// //public async Task CanUpdateUserName() +// //{ +// // var manager = CreateManager(); +// // var user = new IdentityUser("Update"); +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // Assert.Null(await manager.FindByName("New")); +// // user.UserName = "New"; +// // IdentityResultAssert.IsSuccess(await manager.Update(user)); +// // Assert.NotNull(await manager.FindByName("New")); +// // Assert.Null(await manager.FindByName("Update")); +// //} + +// [Fact] +// public async Task UserValidatorCanBlockCreate() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("CreateBlocked"); +// manager.UserValidator = new AlwaysBadValidator(); +// IdentityResultAssert.IsFailure(await manager.Create(user), AlwaysBadValidator.ErrorMessage); +// } + +// //[Fact] +// //public async Task UserValidatorCanBlockUpdate() +// //{ +// // var manager = CreateManager(); +// // var user = new IdentityUser("UpdateBlocked"); +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // manager.UserValidator = new AlwaysBadValidator(); +// // IdentityResultAssert.IsFailure(await manager.Update(user), AlwaysBadValidator.ErrorMessage); +// //} + +// // [Theory] +// // [InlineData("")] +// // [InlineData(null)] +// // public async Task UserValidatorBlocksShortEmailsWhenRequiresUniqueEmail(string email) +// // { +// // var manager = CreateManager(); +// // var user = new IdentityUser("UpdateBlocked") {Email = email}; +// // manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; +// // IdentityResultAssert.IsFailure(await manager.Create(user), "Email cannot be null or empty."); +// // } + +// //#if NET45 +// // [Theory] +// // [InlineData("@@afd")] +// // [InlineData("bogus")] +// // public async Task UserValidatorBlocksInvalidEmailsWhenRequiresUniqueEmail(string email) +// // { +// // var manager = CreateManager(); +// // var user = new IdentityUser("UpdateBlocked") {Email = email}; +// // manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; +// // IdentityResultAssert.IsFailure(await manager.Create(user), "Email '" + email + "' is invalid."); +// // } +// //#endif + +// // [Fact] +// // public async Task PasswordValidatorCanBlockAddPassword() +// // { +// // var manager = CreateManager(); +// // var user = new IdentityUser("AddPasswordBlocked"); +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // manager.PasswordValidator = new AlwaysBadValidator(); +// // IdentityResultAssert.IsFailure(await manager.AddPassword(user.Id, "password"), +// // AlwaysBadValidator.ErrorMessage); +// // } + +// [Fact] +// public async Task PasswordValidatorCanBlockChangePassword() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("ChangePasswordBlocked"); +// IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); +// manager.PasswordValidator = new AlwaysBadValidator(); +// IdentityResultAssert.IsFailure(await manager.ChangePassword(user.Id, "password", "new"), +// AlwaysBadValidator.ErrorMessage); +// } + +// [Fact] +// public async Task CanCreateUserNoPassword() +// { +// var manager = CreateManager(); +// IdentityResultAssert.IsSuccess(await manager.Create(new IdentityUser("CreateUserTest"))); +// var user = await manager.FindByName("CreateUserTest"); +// Assert.NotNull(user); +// Assert.Null(user.PasswordHash); +// var logins = await manager.GetLogins(user.Id); +// Assert.NotNull(logins); +// Assert.Equal(0, logins.Count()); +// } + +// [Fact] +// public async Task CanCreateUserAddLogin() +// { +// var manager = CreateManager(); +// const string userName = "CreateExternalUserTest"; +// const string provider = "ZzAuth"; +// const string providerKey = "HaoKey"; +// IdentityResultAssert.IsSuccess(await manager.Create(new IdentityUser(userName))); +// var user = await manager.FindByName(userName); +// Assert.NotNull(user); +// var login = new UserLoginInfo(provider, providerKey); +// IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); +// var logins = await manager.GetLogins(user.Id); +// Assert.NotNull(logins); +// Assert.Equal(1, logins.Count()); +// Assert.Equal(provider, logins.First().LoginProvider); +// Assert.Equal(providerKey, logins.First().ProviderKey); +// } + +// [Fact] +// public async Task CanCreateUserLoginAndAddPassword() +// { +// var manager = CreateManager(); +// var login = new UserLoginInfo("Provider", "key"); +// var user = new IdentityUser("CreateUserLoginAddPasswordTest"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); +// Assert.False(await manager.HasPassword(user.Id)); +// IdentityResultAssert.IsSuccess(await manager.AddPassword(user.Id, "password")); +// Assert.True(await manager.HasPassword(user.Id)); +// var logins = await manager.GetLogins(user.Id); +// Assert.NotNull(logins); +// Assert.Equal(1, logins.Count()); +// Assert.Equal(user, await manager.Find(login)); +// Assert.Equal(user, await manager.Find(user.UserName, "password")); +// } + +// [Fact] +// public async Task AddPasswordFailsIfAlreadyHave() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("CannotAddAnotherPassword"); +// IdentityResultAssert.IsSuccess(await manager.Create(user, "Password")); +// Assert.True(await manager.HasPassword(user.Id)); +// IdentityResultAssert.IsFailure(await manager.AddPassword(user.Id, "password"), +// "User already has a password set."); +// } + +// [Fact] +// public async Task CanCreateUserAddRemoveLogin() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("CreateUserAddRemoveLoginTest"); +// var login = new UserLoginInfo("Provider", "key"); +// var result = await manager.Create(user); +// Assert.NotNull(user); +// IdentityResultAssert.IsSuccess(result); +// IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); +// Assert.Equal(user, await manager.Find(login)); +// var logins = await manager.GetLogins(user.Id); +// Assert.NotNull(logins); +// Assert.Equal(1, logins.Count()); +// Assert.Equal(login.LoginProvider, logins.Last().LoginProvider); +// Assert.Equal(login.ProviderKey, logins.Last().ProviderKey); +// var stamp = user.SecurityStamp; +// IdentityResultAssert.IsSuccess(await manager.RemoveLogin(user.Id, login)); +// Assert.Null(await manager.Find(login)); +// logins = await manager.GetLogins(user.Id); +// Assert.NotNull(logins); +// Assert.Equal(0, logins.Count()); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanRemovePassword() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("RemovePasswordTest"); +// const string password = "password"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// var stamp = user.SecurityStamp; +// IdentityResultAssert.IsSuccess(await manager.RemovePassword(user.Id)); +// var u = await manager.FindByName(user.UserName); +// Assert.NotNull(u); +// Assert.Null(u.PasswordHash); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanChangePassword() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("ChangePasswordTest"); +// const string password = "password"; +// const string newPassword = "newpassword"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// Assert.Equal(manager.Users.Count(), 1); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// IdentityResultAssert.IsSuccess(await manager.ChangePassword(user.Id, password, newPassword)); +// Assert.Null(await manager.Find(user.UserName, password)); +// Assert.Equal(user, await manager.Find(user.UserName, newPassword)); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanAddRemoveUserClaim() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("ClaimsAddRemove"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// Claim[] claims = { new Claim("c", "v"), new Claim("c2", "v2"), new Claim("c2", "v3") }; +// foreach (var c in claims) +// { +// IdentityResultAssert.IsSuccess(await manager.AddClaim(user.Id, c)); +// } +// var userClaims = await manager.GetClaims(user.Id); +// Assert.Equal(3, userClaims.Count); +// IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[0])); +// userClaims = await manager.GetClaims(user.Id); +// Assert.Equal(2, userClaims.Count); +// IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[1])); +// userClaims = await manager.GetClaims(user.Id); +// Assert.Equal(1, userClaims.Count); +// IdentityResultAssert.IsSuccess(await manager.RemoveClaim(user.Id, claims[2])); +// userClaims = await manager.GetClaims(user.Id); +// Assert.Equal(0, userClaims.Count); +// } + +// [Fact] +// public async Task ChangePasswordFallsIfPasswordWrong() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("user"); +// IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); +// var result = await manager.ChangePassword(user.Id, "bogus", "newpassword"); +// IdentityResultAssert.IsFailure(result, "Incorrect password."); +// } + +// [Fact] +// public async Task AddDupeUserNameFails() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("dupe"); +// var user2 = new IdentityUser("dupe"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsFailure(await manager.Create(user2), "Name dupe is already taken."); +// } + +// [Fact] +// public async Task AddDupeEmailAllowedByDefault() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("dupe") { Email = "yup@yup.com" }; +// var user2 = new IdentityUser("dupeEmail") { Email = "yup@yup.com" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await manager.Create(user2)); +// } + +// [Fact] +// public async Task AddDupeEmailFallsWhenUniqueEmailRequired() +// { +// var manager = CreateManager(); +// manager.UserValidator = new UserValidator { RequireUniqueEmail = true }; +// var user = new IdentityUser("dupe") { Email = "yup@yup.com" }; +// var user2 = new IdentityUser("dupeEmail") { Email = "yup@yup.com" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsFailure(await manager.Create(user2), "Email 'yup@yup.com' is already taken."); +// } + +// [Fact] +// public async Task UpdateSecurityStampActuallyChanges() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("stampMe"); +// Assert.Null(user.SecurityStamp); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task AddDupeLoginFails() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("DupeLogin"); +// var login = new UserLoginInfo("provder", "key"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await manager.AddLogin(user.Id, login)); +// var result = await manager.AddLogin(user.Id, login); +// IdentityResultAssert.IsFailure(result, "A user with that external login already exists."); +// } + +// // Email tests +// [Fact] +// public async Task CanFindByEmail() +// { +// var manager = CreateManager(); +// const string userName = "EmailTest"; +// const string email = "email@test.com"; +// var user = new IdentityUser(userName) { Email = email }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var fetch = await manager.FindByEmail(email); +// Assert.Equal(user, fetch); +// } + +// [Fact] +// public async Task CanFindUsersViaUserQuerable() +// { +// var mgr = CreateManager(); +// var users = new[] +// { +// new IdentityUser("user1"), +// new IdentityUser("user2"), +// new IdentityUser("user3") +// }; +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await mgr.Create(u)); +// } +// var usersQ = mgr.Users; +// Assert.Equal(3, usersQ.Count()); +// Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user1")); +// Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user2")); +// Assert.NotNull(usersQ.FirstOrDefault(u => u.UserName == "user3")); +// Assert.Null(usersQ.FirstOrDefault(u => u.UserName == "bogus")); +// } + +// [Fact] +// public async Task ClaimsIdentityCreatesExpectedClaims() +// { +// var context = CreateContext(); +// var manager = CreateManager(context); +// var role = CreateRoleManager(context); +// var user = new IdentityUser("Hao"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await role.Create(new IdentityRole("Admin"))); +// IdentityResultAssert.IsSuccess(await role.Create(new IdentityRole("Local"))); +// IdentityResultAssert.IsSuccess(await manager.AddToRole(user.Id, "Admin")); +// IdentityResultAssert.IsSuccess(await manager.AddToRole(user.Id, "Local")); +// Claim[] userClaims = +// { +// new Claim("Whatever", "Value"), +// new Claim("Whatever2", "Value2") +// }; +// foreach (var c in userClaims) +// { +// IdentityResultAssert.IsSuccess(await manager.AddClaim(user.Id, c)); +// } + +// var identity = await manager.CreateIdentity(user, "test"); +// var claimsFactory = manager.ClaimsIdentityFactory as ClaimsIdentityFactory; +// Assert.NotNull(claimsFactory); +// var claims = identity.Claims; +// Assert.NotNull(claims); +// Assert.True( +// claims.Any(c => c.Type == claimsFactory.UserNameClaimType && c.Value == user.UserName)); +// Assert.True(claims.Any(c => c.Type == claimsFactory.UserIdClaimType && c.Value == user.Id)); +// Assert.True(claims.Any(c => c.Type == claimsFactory.RoleClaimType && c.Value == "Admin")); +// Assert.True(claims.Any(c => c.Type == claimsFactory.RoleClaimType && c.Value == "Local")); +// foreach (var cl in userClaims) +// { +// Assert.True(claims.Any(c => c.Type == cl.Type && c.Value == cl.Value)); +// } +// } + +// [Fact] +// public async Task ConfirmEmailFalseByDefaultTest() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("test"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// Assert.False(await manager.IsEmailConfirmed(user.Id)); +// } + +// // TODO: No token provider implementations yet +// private class StaticTokenProvider : IUserTokenProvider +// { +// public Task Generate(string purpose, UserManager manager, +// IdentityUser user, CancellationToken token) +// { +// return Task.FromResult(MakeToken(purpose, user)); +// } + +// public Task Validate(string purpose, string token, UserManager manager, +// IdentityUser user, CancellationToken cancellationToken) +// { +// return Task.FromResult(token == MakeToken(purpose, user)); +// } + +// public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) +// { +// return Task.FromResult(0); +// } + +// public Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) +// { +// return Task.FromResult(true); +// } + +// private static string MakeToken(string purpose, IdentityUser user) +// { +// return string.Join(":", user.Id, purpose, "ImmaToken"); +// } +// } + +// [Fact] +// public async Task CanResetPasswordWithStaticTokenProvider() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("ResetPasswordTest"); +// const string password = "password"; +// const string newPassword = "newpassword"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// var token = await manager.GeneratePasswordResetToken(user.Id); +// Assert.NotNull(token); +// IdentityResultAssert.IsSuccess(await manager.ResetPassword(user.Id, token, newPassword)); +// Assert.Null(await manager.Find(user.UserName, password)); +// Assert.Equal(user, await manager.Find(user.UserName, newPassword)); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task PasswordValidatorCanBlockResetPasswordWithStaticTokenProvider() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("ResetPasswordTest"); +// const string password = "password"; +// const string newPassword = "newpassword"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// var token = await manager.GeneratePasswordResetToken(user.Id); +// Assert.NotNull(token); +// manager.PasswordValidator = new AlwaysBadValidator(); +// IdentityResultAssert.IsFailure(await manager.ResetPassword(user.Id, token, newPassword), +// AlwaysBadValidator.ErrorMessage); +// Assert.NotNull(await manager.Find(user.UserName, password)); +// Assert.Equal(user, await manager.Find(user.UserName, password)); +// Assert.Equal(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task ResetPasswordWithStaticTokenProviderFailsWithWrongToken() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("ResetPasswordTest"); +// const string password = "password"; +// const string newPassword = "newpassword"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// IdentityResultAssert.IsFailure(await manager.ResetPassword(user.Id, "bogus", newPassword), "Invalid token."); +// Assert.NotNull(await manager.Find(user.UserName, password)); +// Assert.Equal(user, await manager.Find(user.UserName, password)); +// Assert.Equal(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanGenerateAndVerifyUserTokenWithStaticTokenProvider() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("UserTokenTest"); +// var user2 = new IdentityUser("UserTokenTest2"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsSuccess(await manager.Create(user2)); +// var token = await manager.GenerateUserToken("test", user.Id); +// Assert.True(await manager.VerifyUserToken(user.Id, "test", token)); +// Assert.False(await manager.VerifyUserToken(user.Id, "test2", token)); +// Assert.False(await manager.VerifyUserToken(user.Id, "test", token + "a")); +// Assert.False(await manager.VerifyUserToken(user2.Id, "test", token)); +// } + +// [Fact] +// public async Task CanConfirmEmailWithStaticToken() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("test"); +// Assert.False(user.EmailConfirmed); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var token = await manager.GenerateEmailConfirmationToken(user.Id); +// Assert.NotNull(token); +// IdentityResultAssert.IsSuccess(await manager.ConfirmEmail(user.Id, token)); +// Assert.True(await manager.IsEmailConfirmed(user.Id)); +// IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, null)); +// Assert.False(await manager.IsEmailConfirmed(user.Id)); +// } + +// [Fact] +// public async Task ConfirmEmailWithStaticTokenFailsWithWrongToken() +// { +// var manager = CreateManager(); +// manager.UserTokenProvider = new StaticTokenProvider(); +// var user = new IdentityUser("test"); +// Assert.False(user.EmailConfirmed); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// IdentityResultAssert.IsFailure(await manager.ConfirmEmail(user.Id, "bogus"), "Invalid token."); +// Assert.False(await manager.IsEmailConfirmed(user.Id)); +// } + +// // TODO: Can't reenable til we have a SecurityStamp linked token provider +// //[Fact] +// //public async Task ConfirmTokenFailsAfterPasswordChange() +// //{ +// // var manager = CreateManager(); +// // var user = new IdentityUser("test"); +// // Assert.False(user.EmailConfirmed); +// // IdentityResultAssert.IsSuccess(await manager.Create(user, "password")); +// // var token = await manager.GenerateEmailConfirmationToken(user.Id); +// // Assert.NotNull(token); +// // IdentityResultAssert.IsSuccess(await manager.ChangePassword(user.Id, "password", "newpassword")); +// // IdentityResultAssert.IsFailure(await manager.ConfirmEmail(user.Id, token), "Invalid token."); +// // Assert.False(await manager.IsEmailConfirmed(user.Id)); +// //} + +// // Lockout tests + +// [Fact] +// public async Task SingleFailureLockout() +// { +// var mgr = CreateManager(); +// mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("fastLockout"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.True(await mgr.IsLockedOut(user.Id)); +// Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); +// } + +// [Fact] +// public async Task TwoFailureLockout() +// { +// var mgr = CreateManager(); +// mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); +// mgr.UserLockoutEnabledByDefault = true; +// mgr.MaxFailedAccessAttemptsBeforeLockout = 2; +// var user = new IdentityUser("twoFailureLockout"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.True(await mgr.IsLockedOut(user.Id)); +// Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); +// } + +// [Fact] +// public async Task ResetAccessCountPreventsLockout() +// { +// var mgr = CreateManager(); +// mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); +// mgr.UserLockoutEnabledByDefault = true; +// mgr.MaxFailedAccessAttemptsBeforeLockout = 2; +// var user = new IdentityUser("resetLockout"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.ResetAccessFailedCount(user.Id)); +// Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); +// } + +// [Fact] +// public async Task CanEnableLockoutManuallyAndLockout() +// { +// var mgr = CreateManager(); +// mgr.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1); +// mgr.MaxFailedAccessAttemptsBeforeLockout = 2; +// var user = new IdentityUser("manualLockout"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.False(await mgr.GetLockoutEnabled(user.Id)); +// Assert.False(user.LockoutEnabled); +// IdentityResultAssert.IsSuccess(await mgr.SetLockoutEnabled(user.Id, true)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.False(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(1, await mgr.GetAccessFailedCount(user.Id)); +// IdentityResultAssert.IsSuccess(await mgr.AccessFailed(user.Id)); +// Assert.True(await mgr.IsLockedOut(user.Id)); +// Assert.True(await mgr.GetLockoutEndDate(user.Id) > DateTimeOffset.UtcNow.AddMinutes(55)); +// Assert.Equal(0, await mgr.GetAccessFailedCount(user.Id)); +// } + +// [Fact] +// public async Task UserNotLockedOutWithNullDateTimeAndIsSetToNullDate() +// { +// var mgr = CreateManager(); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("LockoutTest"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, new DateTimeOffset())); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// Assert.Equal(new DateTimeOffset(), await mgr.GetLockoutEndDate(user.Id)); +// Assert.Null(user.LockoutEndDateUtc); +// } + +// [Fact] +// public async Task LockoutFailsIfNotEnabled() +// { +// var mgr = CreateManager(); +// var user = new IdentityUser("LockoutNotEnabledTest"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.False(await mgr.GetLockoutEnabled(user.Id)); +// Assert.False(user.LockoutEnabled); +// IdentityResultAssert.IsFailure(await mgr.SetLockoutEndDate(user.Id, new DateTimeOffset()), +// "Lockout is not enabled for this user."); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// } + +// [Fact] +// public async Task LockoutEndToUtcNowMinus1SecInUserShouldNotBeLockedOut() +// { +// var mgr = CreateManager(); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("LockoutUtcNowTest") { LockoutEndDateUtc = DateTime.UtcNow.AddSeconds(-1) }; +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// } + +// [Fact] +// public async Task LockoutEndToUtcNowSubOneSecondWithManagerShouldNotBeLockedOut() +// { +// var mgr = CreateManager(); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("LockoutUtcNowTest"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, DateTimeOffset.UtcNow.AddSeconds(-1))); +// Assert.False(await mgr.IsLockedOut(user.Id)); +// } + +// [Fact] +// public async Task LockoutEndToUtcNowPlus5ShouldBeLockedOut() +// { +// var mgr = CreateManager(); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("LockoutUtcNowTest") { LockoutEndDateUtc = DateTime.UtcNow.AddMinutes(5) }; +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// Assert.True(await mgr.IsLockedOut(user.Id)); +// } + +// [Fact] +// public async Task UserLockedOutWithDateTimeLocalKindNowPlus30() +// { +// var mgr = CreateManager(); +// mgr.UserLockoutEnabledByDefault = true; +// var user = new IdentityUser("LockoutTest"); +// IdentityResultAssert.IsSuccess(await mgr.Create(user)); +// Assert.True(await mgr.GetLockoutEnabled(user.Id)); +// Assert.True(user.LockoutEnabled); +// var lockoutEnd = new DateTimeOffset(DateTime.Now.AddMinutes(30).ToLocalTime()); +// IdentityResultAssert.IsSuccess(await mgr.SetLockoutEndDate(user.Id, lockoutEnd)); +// Assert.True(await mgr.IsLockedOut(user.Id)); +// var end = await mgr.GetLockoutEndDate(user.Id); +// Assert.Equal(lockoutEnd, end); +// } + +// // Role Tests +// [Fact] +// public async Task CanCreateRoleTest() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("create"); +// Assert.False(await manager.RoleExists(role.Name)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// Assert.True(await manager.RoleExists(role.Name)); +// } + +// private class AlwaysBadValidator : IUserValidator, IRoleValidator, +// IPasswordValidator +// { +// public const string ErrorMessage = "I'm Bad."; + +// public Task Validate(string password, CancellationToken token) +// { +// return Task.FromResult(IdentityResult.Failed(ErrorMessage)); +// } + +// public Task Validate(RoleManager manager, IdentityRole role, CancellationToken token) +// { +// return Task.FromResult(IdentityResult.Failed(ErrorMessage)); +// } + +// public Task Validate(UserManager manager, IdentityUser user, CancellationToken token) +// { +// return Task.FromResult(IdentityResult.Failed(ErrorMessage)); +// } +// } + +// [Fact] +// public async Task BadValidatorBlocksCreateRole() +// { +// var manager = CreateRoleManager(); +// manager.RoleValidator = new AlwaysBadValidator(); +// IdentityResultAssert.IsFailure(await manager.Create(new IdentityRole("blocked")), +// AlwaysBadValidator.ErrorMessage); +// } + +// [Fact] +// public async Task BadValidatorBlocksRoleUpdate() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("poorguy"); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// var error = AlwaysBadValidator.ErrorMessage; +// manager.RoleValidator = new AlwaysBadValidator(); +// IdentityResultAssert.IsFailure(await manager.Update(role), error); +// } + +// [Fact] +// public async Task CanDeleteRoleTest() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("delete"); +// Assert.False(await manager.RoleExists(role.Name)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// IdentityResultAssert.IsSuccess(await manager.Delete(role)); +// Assert.False(await manager.RoleExists(role.Name)); +// } + +// [Fact] +// public async Task CanRoleFindByIdTest() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("FindById"); +// Assert.Null(await manager.FindById(role.Id)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// Assert.Equal(role, await manager.FindById(role.Id)); +// } + +// [Fact] +// public async Task CanRoleFindByName() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("FindByName"); +// Assert.Null(await manager.FindByName(role.Name)); +// Assert.False(await manager.RoleExists(role.Name)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// Assert.Equal(role, await manager.FindByName(role.Name)); +// } + +// [Fact] +// public async Task CanUpdateRoleNameTest() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("update"); +// Assert.False(await manager.RoleExists(role.Name)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// Assert.True(await manager.RoleExists(role.Name)); +// role.Name = "Changed"; +// IdentityResultAssert.IsSuccess(await manager.Update(role)); +// Assert.False(await manager.RoleExists("update")); +// Assert.Equal(role, await manager.FindByName(role.Name)); +// } + +// [Fact] +// public async Task CanQuerableRolesTest() +// { +// var manager = CreateRoleManager(); +// IdentityRole[] roles = +// { +// new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), +// new IdentityRole("r4") +// }; +// foreach (var r in roles) +// { +// IdentityResultAssert.IsSuccess(await manager.Create(r)); +// } +// Assert.Equal(roles.Length, manager.Roles.Count()); +// var r1 = manager.Roles.FirstOrDefault(r => r.Name == "r1"); +// Assert.Equal(roles[0], r1); +// } + +// //[Fact] +// //public async Task DeleteRoleNonEmptySucceedsTest() +// //{ +// // // Need fail if not empty? +// // var userMgr = CreateManager(); +// // var roleMgr = CreateRoleManager(); +// // var role = new IdentityRole("deleteNonEmpty"); +// // Assert.False(await roleMgr.RoleExists(role.Name)); +// // IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// // var user = new IdentityUser("t"); +// // IdentityResultAssert.IsSuccess(await userMgr.Create(user)); +// // IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); +// // IdentityResultAssert.IsSuccess(await roleMgr.Delete(role)); +// // Assert.Null(await roleMgr.FindByName(role.Name)); +// // Assert.False(await roleMgr.RoleExists(role.Name)); +// // // REVIEW: We should throw if deleteing a non empty role? +// // var roles = await userMgr.GetRoles(user.Id); + +// // // In memory this doesn't work since there's no concept of cascading deletes +// // //Assert.Equal(0, roles.Count()); +// //} + +// ////[Fact] +// ////public async Task DeleteUserRemovesFromRoleTest() +// ////{ +// //// // Need fail if not empty? +// //// var userMgr = CreateManager(); +// //// var roleMgr = CreateRoleManager(); +// //// var role = new IdentityRole("deleteNonEmpty"); +// //// Assert.False(await roleMgr.RoleExists(role.Name)); +// //// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// //// var user = new IdentityUser("t"); +// //// IdentityResultAssert.IsSuccess(await userMgr.Create(user)); +// //// IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); +// //// IdentityResultAssert.IsSuccess(await userMgr.Delete(user)); +// //// role = roleMgr.FindById(role.Id); +// ////} + +// [Fact] +// public async Task CreateRoleFailsIfExists() +// { +// var manager = CreateRoleManager(); +// var role = new IdentityRole("dupeRole"); +// Assert.False(await manager.RoleExists(role.Name)); +// IdentityResultAssert.IsSuccess(await manager.Create(role)); +// Assert.True(await manager.RoleExists(role.Name)); +// var role2 = new IdentityRole("dupeRole"); +// IdentityResultAssert.IsFailure(await manager.Create(role2)); +// } + +// [Fact] +// public async Task CanAddUsersToRole() +// { +// var context = CreateContext(); +// var manager = CreateManager(context); +// var roleManager = CreateRoleManager(context); +// var role = new IdentityRole("addUserTest"); +// IdentityResultAssert.IsSuccess(await roleManager.Create(role)); +// IdentityUser[] users = +// { +// new IdentityUser("1"), new IdentityUser("2"), new IdentityUser("3"), +// new IdentityUser("4") +// }; +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await manager.Create(u)); +// IdentityResultAssert.IsSuccess(await manager.AddToRole(u.Id, role.Name)); +// Assert.True(await manager.IsInRole(u.Id, role.Name)); +// } +// } + +// [Fact] +// public async Task CanGetRolesForUser() +// { +// var context = CreateContext(); +// var userManager = CreateManager(context); +// var roleManager = CreateRoleManager(context); +// IdentityUser[] users = +// { +// new IdentityUser("u1"), new IdentityUser("u2"), new IdentityUser("u3"), +// new IdentityUser("u4") +// }; +// IdentityRole[] roles = +// { +// new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), +// new IdentityRole("r4") +// }; +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await userManager.Create(u)); +// } +// foreach (var r in roles) +// { +// IdentityResultAssert.IsSuccess(await roleManager.Create(r)); +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await userManager.AddToRole(u.Id, r.Name)); +// Assert.True(await userManager.IsInRole(u.Id, r.Name)); +// } +// } + +// foreach (var u in users) +// { +// var rs = await userManager.GetRoles(u.Id); +// Assert.Equal(roles.Length, rs.Count); +// foreach (var r in roles) +// { +// Assert.True(rs.Any(role => role == r.Name)); +// } +// } +// } + + +// [Fact] +// public async Task RemoveUserFromRoleWithMultipleRoles() +// { +// var context = CreateContext(); +// var userManager = CreateManager(context); +// var roleManager = CreateRoleManager(context); +// var user = new IdentityUser("MultiRoleUser"); +// IdentityResultAssert.IsSuccess(await userManager.Create(user)); +// IdentityRole[] roles = +// { +// new IdentityRole("r1"), new IdentityRole("r2"), new IdentityRole("r3"), +// new IdentityRole("r4") +// }; +// foreach (var r in roles) +// { +// IdentityResultAssert.IsSuccess(await roleManager.Create(r)); +// IdentityResultAssert.IsSuccess(await userManager.AddToRole(user.Id, r.Name)); +// Assert.True(await userManager.IsInRole(user.Id, r.Name)); +// } +// IdentityResultAssert.IsSuccess(await userManager.RemoveFromRole(user.Id, roles[2].Name)); +// Assert.False(await userManager.IsInRole(user.Id, roles[2].Name)); +// } + +// [Fact] +// public async Task CanRemoveUsersFromRole() +// { +// var context = CreateContext(); +// var userManager = CreateManager(context); +// var roleManager = CreateRoleManager(context); +// IdentityUser[] users = +// { +// new IdentityUser("1"), new IdentityUser("2"), new IdentityUser("3"), +// new IdentityUser("4") +// }; +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await userManager.Create(u)); +// } +// var r = new IdentityRole("r1"); +// IdentityResultAssert.IsSuccess(await roleManager.Create(r)); +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await userManager.AddToRole(u.Id, r.Name)); +// Assert.True(await userManager.IsInRole(u.Id, r.Name)); +// } +// foreach (var u in users) +// { +// IdentityResultAssert.IsSuccess(await userManager.RemoveFromRole(u.Id, r.Name)); +// Assert.False(await userManager.IsInRole(u.Id, r.Name)); +// } +// } + +// [Fact] +// public async Task RemoveUserNotInRoleFails() +// { +// var context = CreateContext(); +// var userMgr = CreateManager(context); +// var roleMgr = CreateRoleManager(context); +// var role = new IdentityRole("addUserDupeTest"); +// var user = new IdentityUser("user1"); +// IdentityResultAssert.IsSuccess(await userMgr.Create(user)); +// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// var result = await userMgr.RemoveFromRole(user.Id, role.Name); +// IdentityResultAssert.IsFailure(result, "User is not in role."); +// } + +// [Fact] +// public async Task AddUserToRoleFailsIfAlreadyInRole() +// { +// var context = CreateContext(); +// var userMgr = CreateManager(context); +// var roleMgr = CreateRoleManager(context); +// var role = new IdentityRole("addUserDupeTest"); +// var user = new IdentityUser("user1"); +// IdentityResultAssert.IsSuccess(await userMgr.Create(user)); +// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// IdentityResultAssert.IsSuccess(await userMgr.AddToRole(user.Id, role.Name)); +// Assert.True(await userMgr.IsInRole(user.Id, role.Name)); +// IdentityResultAssert.IsFailure(await userMgr.AddToRole(user.Id, role.Name), "User already in role."); +// } + +// [Fact] +// public async Task CanFindRoleByNameWithManager() +// { +// var roleMgr = CreateRoleManager(); +// var role = new IdentityRole("findRoleByNameTest"); +// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// Assert.Equal(role.Id, (await roleMgr.FindByName(role.Name)).Id); +// } + +// [Fact] +// public async Task CanFindRoleWithManager() +// { +// var roleMgr = CreateRoleManager(); +// var role = new IdentityRole("findRoleTest"); +// IdentityResultAssert.IsSuccess(await roleMgr.Create(role)); +// Assert.Equal(role, await roleMgr.FindById(role.Id)); +// } + +// [Fact] +// public async Task SetPhoneNumberTest() +// { +// var manager = CreateManager(); +// var userName = "PhoneTest"; +// var user = new IdentityUser(userName); +// user.PhoneNumber = "123-456-7890"; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var stamp = await manager.GetSecurityStamp(user.Id); +// Assert.Equal(await manager.GetPhoneNumber(user.Id), "123-456-7890"); +// IdentityResultAssert.IsSuccess(await manager.SetPhoneNumber(user.Id, "111-111-1111")); +// Assert.Equal(await manager.GetPhoneNumber(user.Id), "111-111-1111"); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanChangePhoneNumber() +// { +// var manager = CreateManager(); +// const string userName = "PhoneTest"; +// var user = new IdentityUser(userName) { PhoneNumber = "123-456-7890" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); +// var stamp = await manager.GetSecurityStamp(user.Id); +// var token1 = await manager.GenerateChangePhoneNumberToken(user.Id, "111-111-1111"); +// IdentityResultAssert.IsSuccess(await manager.ChangePhoneNumber(user.Id, "111-111-1111", token1)); +// Assert.True(await manager.IsPhoneNumberConfirmed(user.Id)); +// Assert.Equal(await manager.GetPhoneNumber(user.Id), "111-111-1111"); +// Assert.NotEqual(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task ChangePhoneNumberFailsWithWrongToken() +// { +// var manager = CreateManager(); +// const string userName = "PhoneTest"; +// var user = new IdentityUser(userName) { PhoneNumber = "123-456-7890" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); +// var stamp = await manager.GetSecurityStamp(user.Id); +// IdentityResultAssert.IsFailure(await manager.ChangePhoneNumber(user.Id, "111-111-1111", "bogus"), +// "Invalid token."); +// Assert.False(await manager.IsPhoneNumberConfirmed(user.Id)); +// Assert.Equal(await manager.GetPhoneNumber(user.Id), "123-456-7890"); +// Assert.Equal(stamp, user.SecurityStamp); +// } + +// [Fact] +// public async Task CanVerifyPhoneNumber() +// { +// var manager = CreateManager(); +// const string userName = "VerifyPhoneTest"; +// var user = new IdentityUser(userName); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// const string num1 = "111-123-4567"; +// const string num2 = "111-111-1111"; +// var token1 = await manager.GenerateChangePhoneNumberToken(user.Id, num1); +// var token2 = await manager.GenerateChangePhoneNumberToken(user.Id, num2); +// Assert.NotEqual(token1, token2); +// Assert.True(await manager.VerifyChangePhoneNumberToken(user.Id, token1, num1)); +// Assert.True(await manager.VerifyChangePhoneNumberToken(user.Id, token2, num2)); +// Assert.False(await manager.VerifyChangePhoneNumberToken(user.Id, token2, num1)); +// Assert.False(await manager.VerifyChangePhoneNumberToken(user.Id, token1, num2)); +// } + +// private class EmailTokenProvider : IUserTokenProvider +// { +// public Task Generate(string purpose, UserManager manager, IdentityUser user, CancellationToken token) +// { +// return Task.FromResult(MakeToken(purpose)); +// } + +// public Task Validate(string purpose, string token, UserManager manager, +// IdentityUser user, CancellationToken cancellationToken) +// { +// return Task.FromResult(token == MakeToken(purpose)); +// } + +// public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) +// { +// return manager.SendEmail(user.Id, token, token); +// } + +// public async Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) +// { +// return !string.IsNullOrEmpty(await manager.GetEmail(user.Id)); +// } + +// private static string MakeToken(string purpose) +// { +// return "email:" + purpose; +// } +// } + +// private class SmsTokenProvider : IUserTokenProvider +// { +// public Task Generate(string purpose, UserManager manager, IdentityUser user, CancellationToken token) +// { +// return Task.FromResult(MakeToken(purpose)); +// } + +// public Task Validate(string purpose, string token, UserManager manager, +// IdentityUser user, CancellationToken cancellationToken) +// { +// return Task.FromResult(token == MakeToken(purpose)); +// } + +// public Task Notify(string token, UserManager manager, IdentityUser user, CancellationToken cancellationToken) +// { +// return manager.SendSms(user.Id, token); +// } + +// public async Task IsValidProviderForUser(UserManager manager, IdentityUser user, CancellationToken token) +// { +// return !string.IsNullOrEmpty(await manager.GetPhoneNumber(user.Id)); +// } + +// private static string MakeToken(string purpose) +// { +// return "sms:" + purpose; +// } +// } + +// [Fact] +// public async Task CanEmailTwoFactorToken() +// { +// var manager = CreateManager(); +// var messageService = new TestMessageService(); +// manager.EmailService = messageService; +// const string factorId = "EmailCode"; +// manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider()); +// var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; +// const string password = "password"; +// IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// Assert.NotNull(token); +// Assert.Null(messageService.Message); +// IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); +// Assert.NotNull(messageService.Message); +// Assert.Equal(token, messageService.Message.Subject); +// Assert.Equal(token, messageService.Message.Body); +// Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// } + +// [Fact] +// public async Task NotifyWithUnknownProviderFails() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("NotifyFail"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// await +// ExceptionAssert.ThrowsAsync( +// async () => await manager.NotifyTwoFactorToken(user.Id, "Bogus", "token"), +// "No IUserTwoFactorProvider for 'Bogus' is registered."); +// } + + +// //[Fact] +// //public async Task EmailTokenFactorWithFormatTest() +// //{ +// // var manager = CreateManager(); +// // var messageService = new TestMessageService(); +// // manager.EmailService = messageService; +// // const string factorId = "EmailCode"; +// // manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider +// // { +// // Subject = "Security Code", +// // BodyFormat = "Your code is: {0}" +// // }); +// // var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; +// // const string password = "password"; +// // IdentityResultAssert.IsSuccess(await manager.Create(user, password)); +// // var stamp = user.SecurityStamp; +// // Assert.NotNull(stamp); +// // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// // Assert.NotNull(token); +// // Assert.Null(messageService.Message); +// // IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); +// // Assert.NotNull(messageService.Message); +// // Assert.Equal("Security Code", messageService.Message.Subject); +// // Assert.Equal("Your code is: " + token, messageService.Message.Body); +// // Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// //} + +// //[Fact] +// //public async Task EmailFactorFailsAfterSecurityStampChangeTest() +// //{ +// // var manager = CreateManager(); +// // const string factorId = "EmailCode"; +// // manager.RegisterTwoFactorProvider(factorId, new EmailTokenProvider()); +// // var user = new IdentityUser("EmailCodeTest") { Email = "foo@foo.com" }; +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // var stamp = user.SecurityStamp; +// // Assert.NotNull(stamp); +// // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// // Assert.NotNull(token); +// // IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); +// // Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// //} + +// [Fact] +// public async Task EnableTwoFactorChangesSecurityStamp() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("TwoFactorEnabledTest"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// IdentityResultAssert.IsSuccess(await manager.SetTwoFactorEnabled(user.Id, true)); +// Assert.NotEqual(stamp, await manager.GetSecurityStamp(user.Id)); +// Assert.True(await manager.GetTwoFactorEnabled(user.Id)); +// } + +// [Fact] +// public async Task CanSendSms() +// { +// var manager = CreateManager(); +// var messageService = new TestMessageService(); +// manager.SmsService = messageService; +// var user = new IdentityUser("SmsTest") { PhoneNumber = "4251234567" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// await manager.SendSms(user.Id, "Hi"); +// Assert.NotNull(messageService.Message); +// Assert.Equal("Hi", messageService.Message.Body); +// } + +// [Fact] +// public async Task CanSendEmail() +// { +// var manager = CreateManager(); +// var messageService = new TestMessageService(); +// manager.EmailService = messageService; +// var user = new IdentityUser("EmailTest") { Email = "foo@foo.com" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// await manager.SendEmail(user.Id, "Hi", "Body"); +// Assert.NotNull(messageService.Message); +// Assert.Equal("Hi", messageService.Message.Subject); +// Assert.Equal("Body", messageService.Message.Body); +// } + +// [Fact] +// public async Task CanSmsTwoFactorToken() +// { +// var manager = CreateManager(); +// var messageService = new TestMessageService(); +// manager.SmsService = messageService; +// const string factorId = "PhoneCode"; +// manager.RegisterTwoFactorProvider(factorId, new SmsTokenProvider()); +// var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var stamp = user.SecurityStamp; +// Assert.NotNull(stamp); +// var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// Assert.NotNull(token); +// Assert.Null(messageService.Message); +// IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); +// Assert.NotNull(messageService.Message); +// Assert.Equal(token, messageService.Message.Body); +// Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// } + +// //[Fact] +// //public async Task PhoneTokenFactorFormatTest() +// //{ +// // var manager = CreateManager(); +// // var messageService = new TestMessageService(); +// // manager.SmsService = messageService; +// // const string factorId = "PhoneCode"; +// // manager.RegisterTwoFactorProvider(factorId, new PhoneNumberTokenProvider +// // { +// // MessageFormat = "Your code is: {0}" +// // }); +// // var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // var stamp = user.SecurityStamp; +// // Assert.NotNull(stamp); +// // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// // Assert.NotNull(token); +// // Assert.Null(messageService.Message); +// // IdentityResultAssert.IsSuccess(await manager.NotifyTwoFactorToken(user.Id, factorId, token)); +// // Assert.NotNull(messageService.Message); +// // Assert.Equal("Your code is: " + token, messageService.Message.Body); +// // Assert.True(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// //} + +// [Fact] +// public async Task GenerateTwoFactorWithUnknownFactorProviderWillThrow() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("PhoneCodeTest"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// const string error = "No IUserTwoFactorProvider for 'bogus' is registered."; +// await +// ExceptionAssert.ThrowsAsync( +// () => manager.GenerateTwoFactorToken(user.Id, "bogus"), error); +// await ExceptionAssert.ThrowsAsync( +// () => manager.VerifyTwoFactorToken(user.Id, "bogus", "bogus"), error); +// } + +// [Fact] +// public async Task GetValidTwoFactorTestEmptyWithNoProviders() +// { +// var manager = CreateManager(); +// var user = new IdentityUser("test"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var factors = await manager.GetValidTwoFactorProviders(user.Id); +// Assert.NotNull(factors); +// Assert.True(!factors.Any()); +// } + +// [Fact] +// public async Task GetValidTwoFactorTest() +// { +// var manager = CreateManager(); +// manager.RegisterTwoFactorProvider("phone", new SmsTokenProvider()); +// manager.RegisterTwoFactorProvider("email", new EmailTokenProvider()); +// var user = new IdentityUser("test"); +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var factors = await manager.GetValidTwoFactorProviders(user.Id); +// Assert.NotNull(factors); +// Assert.True(!factors.Any()); +// IdentityResultAssert.IsSuccess(await manager.SetPhoneNumber(user.Id, "111-111-1111")); +// factors = await manager.GetValidTwoFactorProviders(user.Id); +// Assert.NotNull(factors); +// Assert.True(factors.Count() == 1); +// Assert.Equal("phone", factors[0]); +// IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, "test@test.com")); +// factors = await manager.GetValidTwoFactorProviders(user.Id); +// Assert.NotNull(factors); +// Assert.True(factors.Count() == 2); +// IdentityResultAssert.IsSuccess(await manager.SetEmail(user.Id, null)); +// factors = await manager.GetValidTwoFactorProviders(user.Id); +// Assert.NotNull(factors); +// Assert.True(factors.Count() == 1); +// Assert.Equal("phone", factors[0]); +// } + +// //[Fact] +// //public async Task PhoneFactorFailsAfterSecurityStampChangeTest() +// //{ +// // var manager = CreateManager(); +// // var factorId = "PhoneCode"; +// // manager.RegisterTwoFactorProvider(factorId, new PhoneNumberTokenProvider()); +// // var user = new IdentityUser("PhoneCodeTest"); +// // user.PhoneNumber = "4251234567"; +// // IdentityResultAssert.IsSuccess(await manager.Create(user)); +// // var stamp = user.SecurityStamp; +// // Assert.NotNull(stamp); +// // var token = await manager.GenerateTwoFactorToken(user.Id, factorId); +// // Assert.NotNull(token); +// // IdentityResultAssert.IsSuccess(await manager.UpdateSecurityStamp(user.Id)); +// // Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, token)); +// //} + +// [Fact] +// public async Task VerifyTokenFromWrongTokenProviderFails() +// { +// var manager = CreateManager(); +// manager.RegisterTwoFactorProvider("PhoneCode", new SmsTokenProvider()); +// manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider()); +// var user = new IdentityUser("WrongTokenProviderTest") { PhoneNumber = "4251234567" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// var token = await manager.GenerateTwoFactorToken(user.Id, "PhoneCode"); +// Assert.NotNull(token); +// Assert.False(await manager.VerifyTwoFactorToken(user.Id, "EmailCode", token)); +// } + +// [Fact] +// public async Task VerifyWithWrongSmsTokenFails() +// { +// var manager = CreateManager(); +// const string factorId = "PhoneCode"; +// manager.RegisterTwoFactorProvider(factorId, new SmsTokenProvider()); +// var user = new IdentityUser("PhoneCodeTest") { PhoneNumber = "4251234567" }; +// IdentityResultAssert.IsSuccess(await manager.Create(user)); +// Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, "bogus")); +// } + +// private class DataStoreConfig : ContextConfiguration +// { +// private readonly DataStore _store; + +// public DataStoreConfig(DataStore store) +// { +// _store = store; +// } + +// public override DataStore DataStore +// { +// get { return _store; } +// } + +// } + +// private static EntityContext CreateContext() +// { +// var configuration = new EntityConfigurationBuilder() +// //.UseModel(model) +// .UseDataStore(new InMemoryDataStore()) +// .BuildConfiguration(); + +// var db = new IdentityContext(configuration); +// // var sql = db.Configuration.DataStore as SqlServerDataStore; +// // if (sql != null) +// // { +// //#if NET45 +// // var builder = new DbConnectionStringBuilder {ConnectionString = sql.ConnectionString}; +// // var targetDatabase = builder["Database"].ToString(); + +// // // Connect to master, check if database exists, and create if not +// // builder.Add("Database", "master"); +// // using (var masterConnection = new SqlConnection(builder.ConnectionString)) +// // { +// // masterConnection.Open(); + +// // var masterCommand = masterConnection.CreateCommand(); +// // masterCommand.CommandText = "SELECT COUNT(*) FROM sys.databases WHERE [name]=N'" + targetDatabase + +// // "'"; +// // if ((int?) masterCommand.ExecuteScalar() < 1) +// // { +// // masterCommand.CommandText = "CREATE DATABASE [" + targetDatabase + "]"; +// // masterCommand.ExecuteNonQuery(); + +// // using (var conn = new SqlConnection(sql.ConnectionString)) +// // { +// // conn.Open(); +// // var command = conn.CreateCommand(); +// // command.CommandText = @" +// //CREATE TABLE [dbo].[AspNetUsers] ( +// //[Id] NVARCHAR (128) NOT NULL, +// //[Email] NVARCHAR (256) NULL, +// //[EmailConfirmed] BIT NOT NULL, +// //[PasswordHash] NVARCHAR (MAX) NULL, +// //[SecurityStamp] NVARCHAR (MAX) NULL, +// //[PhoneNumber] NVARCHAR (MAX) NULL, +// //[PhoneNumberConfirmed] BIT NOT NULL, +// //[TwoFactorEnabled] BIT NOT NULL, +// //[LockoutEndDateUtc] DATETIME NULL, +// //[LockoutEnabled] BIT NOT NULL, +// //[AccessFailedCount] INT NOT NULL, +// //[UserName] NVARCHAR (256) NOT NULL +// //) "; +// // //CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC) +// // command.ExecuteNonQuery(); +// // } +// // } +// // } +// //#else +// // throw new NotSupportedException("SQL Server is not yet supported when running against K10."); +// //#endif +// //} + + +// // TODO: Create DB? +// return db; +// } + + +// private static UserManager CreateManager(EntityContext context) +// { +// return new UserManager(new UserStore(context)); +// } + +// private static UserManager CreateManager() +// { +// return CreateManager(CreateContext()); +// } + +// private static RoleManager CreateRoleManager(EntityContext context) +// { +// return new RoleManager(new RoleStore(context)); +// } + +// private static RoleManager CreateRoleManager() +// { +// return CreateRoleManager(CreateContext()); +// } + +// public class TestMessageService : IIdentityMessageService +// { +// public IdentityMessage Message { get; set; } + +// public Task Send(IdentityMessage message, CancellationToken token) +// { +// Message = message; +// return Task.FromResult(0); +// } +// } +// } +//} diff --git a/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryStoreTest.cs b/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryStoreTest.cs index 871a3ac419..19f3b82850 100644 --- a/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryStoreTest.cs @@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test { var manager = CreateManager(); var user = new InMemoryUser("UpdateBlocked") {Email = email}; - manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; + manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; IdentityResultAssert.IsFailure(await manager.Create(user), "Email cannot be null or empty."); } @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test { var manager = CreateManager(); var user = new InMemoryUser("UpdateBlocked") {Email = email}; - manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; + manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; IdentityResultAssert.IsFailure(await manager.Create(user), "Email '" + email + "' is invalid."); } #endif @@ -272,7 +272,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test public async Task AddDupeEmailFallsWhenUniqueEmailRequired() { var manager = CreateManager(); - manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; + manager.UserValidator = new UserValidator {RequireUniqueEmail = true}; var user = new InMemoryUser("dupe") {Email = "yup@yup.com"}; var user2 = new InMemoryUser("dupeEmail") {Email = "yup@yup.com"}; IdentityResultAssert.IsSuccess(await manager.Create(user)); @@ -361,7 +361,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test } var identity = await manager.CreateIdentity(user, "test"); - var claimsFactory = manager.ClaimsIdentityFactory as ClaimsIdentityFactory; + var claimsFactory = manager.ClaimsIdentityFactory as ClaimsIdentityFactory; Assert.NotNull(claimsFactory); var claims = identity.Claims; Assert.NotNull(claims); @@ -386,31 +386,31 @@ namespace Microsoft.AspNet.Identity.InMemory.Test } // TODO: No token provider implementations yet - private class StaticTokenProvider : IUserTokenProvider + private class StaticTokenProvider : IUserTokenProvider { - public Task Generate(string purpose, UserManager manager, + public Task Generate(string purpose, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(MakeToken(purpose, user)); } - public Task Validate(string purpose, string token, UserManager manager, + public Task Validate(string purpose, string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(token == MakeToken(purpose, user)); } - public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(true); } - private static string MakeToken(string purpose, IUser user) + private static string MakeToken(string purpose, InMemoryUser user) { return string.Join(":", user.Id, purpose, "ImmaToken"); } @@ -715,7 +715,7 @@ namespace Microsoft.AspNet.Identity.InMemory.Test Assert.True(await manager.RoleExists(role.Name)); } - private class AlwaysBadValidator : IUserValidator, IRoleValidator, + private class AlwaysBadValidator : IUserValidator, IRoleValidator, IPasswordValidator { public const string ErrorMessage = "I'm Bad."; @@ -725,12 +725,12 @@ namespace Microsoft.AspNet.Identity.InMemory.Test return Task.FromResult(IdentityResult.Failed(ErrorMessage)); } - public Task Validate(RoleManager manager, InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken)) + public Task Validate(RoleManager manager, InMemoryRole role, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Failed(ErrorMessage)); } - public Task Validate(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Validate(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(IdentityResult.Failed(ErrorMessage)); } @@ -1091,25 +1091,25 @@ namespace Microsoft.AspNet.Identity.InMemory.Test Assert.False(await manager.VerifyChangePhoneNumberToken(user.Id, token1, num2)); } - private class EmailTokenProvider : IUserTokenProvider + private class EmailTokenProvider : IUserTokenProvider { - public Task Generate(string purpose, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Generate(string purpose, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(MakeToken(purpose)); } - public Task Validate(string purpose, string token, UserManager manager, + public Task Validate(string purpose, string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(token == MakeToken(purpose)); } - public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return manager.SendEmail(user.Id, token, token); } - public async Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public async Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return !string.IsNullOrEmpty(await manager.GetEmail(user.Id)); } @@ -1120,27 +1120,27 @@ namespace Microsoft.AspNet.Identity.InMemory.Test } } - private class SmsTokenProvider : IUserTokenProvider + private class SmsTokenProvider : IUserTokenProvider { - public Task Generate(string purpose, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Generate(string purpose, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(MakeToken(purpose)); } - public Task Validate(string purpose, string token, UserManager manager, + public Task Validate(string purpose, string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(token == MakeToken(purpose)); } - public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Notify(string token, UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { - return manager.SendSms(user.Id, token); + return manager.SendSms(user.Id, token, cancellationToken); } - public async Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) + public async Task IsValidProviderForUser(UserManager manager, InMemoryUser user, CancellationToken cancellationToken = default(CancellationToken)) { - return !string.IsNullOrEmpty(await manager.GetPhoneNumber(user.Id)); + return !string.IsNullOrEmpty(await manager.GetPhoneNumber(user.Id, cancellationToken)); } private static string MakeToken(string purpose) @@ -1406,9 +1406,9 @@ namespace Microsoft.AspNet.Identity.InMemory.Test Assert.False(await manager.VerifyTwoFactorToken(user.Id, factorId, "bogus")); } - private static UserManager CreateManager() + private static UserManager CreateManager() { - return new UserManager(new InMemoryUserStore()); + return new UserManager(new InMemoryUserStore()); } private static RoleManager CreateRoleManager() diff --git a/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs b/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs index 3271322a36..e3141d7962 100644 --- a/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs @@ -17,10 +17,10 @@ namespace Microsoft.AspNet.Identity.Security.Test public async Task EnsureClaimsIdentityFactoryCreateIdentityCalled() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser { UserName = "Foo" }; - var userManager = new UserManager(store.Object); - var identityFactory = new Mock>(); + var userManager = new UserManager(store.Object); + var identityFactory = new Mock>(); const string authType = "Test"; var testIdentity = new ClaimsIdentity(authType); identityFactory.Setup(s => s.Create(userManager, user, authType, CancellationToken.None)).ReturnsAsync(testIdentity).Verifiable(); @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Identity.Security.Test var response = new Mock(); context.Setup(c => c.Response).Returns(response.Object).Verifiable(); response.Setup(r => r.SignIn(testIdentity, It.IsAny())).Verifiable(); - var helper = new SignInManager { UserManager = userManager, AuthenticationType = authType, Context = context.Object }; + var helper = new SignInManager { UserManager = userManager, AuthenticationType = authType, Context = context.Object }; // Act await helper.SignIn(user, false, false); @@ -43,10 +43,10 @@ namespace Microsoft.AspNet.Identity.Security.Test { // Setup var user = new TestUser { UserName = "Foo" }; - var manager = new Mock>(); + var manager = new Mock>(); manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(true).Verifiable(); manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); - var helper = new SignInManager { UserManager = manager.Object }; + var helper = new SignInManager { UserManager = manager.Object }; // Act var result = await helper.PasswordSignIn(user.UserName, "bogus", false, false); @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Identity.Security.Test { // Setup var user = new TestUser { UserName = "Foo" }; - var manager = new Mock>(); + var manager = new Mock>(); manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(false).Verifiable(); manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.CheckPassword(user, "password", CancellationToken.None)).ReturnsAsync(true).Verifiable(); @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Identity.Security.Test var response = new Mock(); context.Setup(c => c.Response).Returns(response.Object).Verifiable(); response.Setup(r => r.SignIn(It.IsAny(), It.IsAny())).Verifiable(); - var helper = new SignInManager { UserManager = manager.Object, Context = context.Object }; + var helper = new SignInManager { UserManager = manager.Object, Context = context.Object }; // Act var result = await helper.PasswordSignIn(user.UserName, "password", false, false); @@ -85,11 +85,11 @@ namespace Microsoft.AspNet.Identity.Security.Test { // Setup var user = new TestUser { UserName = "Foo" }; - var manager = new Mock>(); + var manager = new Mock>(); manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).ReturnsAsync(false).Verifiable(); manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.CheckPassword(user, "bogus", CancellationToken.None)).ReturnsAsync(false).Verifiable(); - var helper = new SignInManager { UserManager = manager.Object }; + var helper = new SignInManager { UserManager = manager.Object }; // Act var result = await helper.PasswordSignIn(user.UserName, "bogus", false, false); @@ -104,9 +104,9 @@ namespace Microsoft.AspNet.Identity.Security.Test public async Task PasswordSignInFailsWithUnknownUser() { // Setup - var manager = new Mock>(); + var manager = new Mock>(); manager.Setup(m => m.FindByName("bogus", CancellationToken.None)).ReturnsAsync(null).Verifiable(); - var helper = new SignInManager { UserManager = manager.Object }; + var helper = new SignInManager { UserManager = manager.Object }; // Act var result = await helper.PasswordSignIn("bogus", "bogus", false, false); @@ -120,7 +120,7 @@ namespace Microsoft.AspNet.Identity.Security.Test public async Task PasswordSignInFailsWithNoUserManager() { // Setup - var helper = new SignInManager(); + var helper = new SignInManager(); // Act var result = await helper.PasswordSignIn("bogus", "bogus", false, false); @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Identity.Security.Test { // Setup var user = new TestUser(); - var helper = new SignInManager(); + var helper = new SignInManager(); // Act var result = await helper.CreateUserIdentity(user); @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Identity.Security.Test { // Setup var user = new TestUser { UserName = "Foo" }; - var manager = new Mock>(); + var manager = new Mock>(); var lockedout = false; manager.Setup(m => m.AccessFailed(user.Id, CancellationToken.None)).Returns(() => { @@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Identity.Security.Test manager.Setup(m => m.IsLockedOut(user.Id, CancellationToken.None)).Returns(() => Task.FromResult(lockedout)); manager.Setup(m => m.FindByName(user.UserName, CancellationToken.None)).ReturnsAsync(user).Verifiable(); manager.Setup(m => m.CheckPassword(user, "bogus", CancellationToken.None)).ReturnsAsync(false).Verifiable(); - var helper = new SignInManager { UserManager = manager.Object }; + var helper = new SignInManager { UserManager = manager.Object }; // Act var result = await helper.PasswordSignIn(user.UserName, "bogus", false, true); diff --git a/test/Microsoft.AspNet.Identity.Security.Test/TestUser.cs b/test/Microsoft.AspNet.Identity.Security.Test/TestUser.cs index aa9ab7607f..80cca7683a 100644 --- a/test/Microsoft.AspNet.Identity.Security.Test/TestUser.cs +++ b/test/Microsoft.AspNet.Identity.Security.Test/TestUser.cs @@ -1,12 +1,8 @@ namespace Microsoft.AspNet.Identity.Security.Test { - public class TestUser : TestUser + public class TestUser { - } - - public class TestUser : IUser - { - public TKey Id { get; private set; } + public string Id { get; private set; } public string UserName { get; set; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs b/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs index 49722d323a..2826fc46ab 100644 --- a/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/ClaimsIdentityFactoryTest.cs @@ -13,8 +13,8 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task CreateIdentityNullChecks() { - var factory = new ClaimsIdentityFactory(); - var manager = new UserManager(new NoopUserStore()); + var factory = new ClaimsIdentityFactory(); + var manager = new UserManager(new NoopUserStore()); await Assert.ThrowsAsync("manager", async () => await factory.Create(null, null, "whatever")); await Assert.ThrowsAsync("user", @@ -33,17 +33,19 @@ namespace Microsoft.AspNet.Identity.Test public async Task EnsureClaimsIdentityHasExpectedClaims(bool supportRoles, bool supportClaims) { // Setup - var userManager = new Mock>(); + var userManager = new Mock>(); var user = new TestUser { UserName = "Foo" }; userManager.Setup(m => m.SupportsUserRole).Returns(supportRoles); userManager.Setup(m => m.SupportsUserClaim).Returns(supportClaims); + userManager.Setup(m => m.GetUserId(user, CancellationToken.None)).ReturnsAsync(user.Id); + userManager.Setup(m => m.GetUserName(user, CancellationToken.None)).ReturnsAsync(user.UserName); var roleClaims = new[] { "Admin", "Local" }; userManager.Setup(m => m.GetRoles(user.Id, CancellationToken.None)).ReturnsAsync(roleClaims); var userClaims = new[] { new Claim("Whatever", "Value"), new Claim("Whatever2", "Value2") }; userManager.Setup(m => m.GetClaims(user.Id, CancellationToken.None)).ReturnsAsync(userClaims); const string authType = "Microsoft.AspNet.Identity"; - var factory = new ClaimsIdentityFactory(); + var factory = new ClaimsIdentityFactory(); // Act var identity = await factory.Create(userManager.Object, user, authType); diff --git a/test/Microsoft.AspNet.Identity.Test/NoopRoleStore.cs b/test/Microsoft.AspNet.Identity.Test/NoopRoleStore.cs index f1173efa41..f6c70e2511 100644 --- a/test/Microsoft.AspNet.Identity.Test/NoopRoleStore.cs +++ b/test/Microsoft.AspNet.Identity.Test/NoopRoleStore.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Identity.Test { - public class NoopRoleStore : IRoleStore + public class NoopRoleStore : IRoleStore { public Task Create(TestRole user, CancellationToken cancellationToken = default(CancellationToken)) { @@ -15,6 +15,11 @@ namespace Microsoft.AspNet.Identity.Test return Task.FromResult(0); } + public Task GetRoleName(TestRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(null); + } + public Task FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(null); @@ -33,5 +38,10 @@ namespace Microsoft.AspNet.Identity.Test { return Task.FromResult(0); } + + public Task GetRoleId(TestRole role, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(null); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Identity.Test/NoopUserStore.cs b/test/Microsoft.AspNet.Identity.Test/NoopUserStore.cs index 014144e9ae..d9b54af6d1 100644 --- a/test/Microsoft.AspNet.Identity.Test/NoopUserStore.cs +++ b/test/Microsoft.AspNet.Identity.Test/NoopUserStore.cs @@ -3,8 +3,18 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Identity.Test { - public class NoopUserStore : IUserStore + public class NoopUserStore : IUserStore { + public Task GetUserId(TestUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(user.Id); + } + + public Task GetUserName(TestUser user, CancellationToken cancellationToken = new CancellationToken()) + { + return Task.FromResult(user.UserName); + } + public Task Create(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); diff --git a/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs index 3c50147c7c..2d2cfbd503 100644 --- a/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/RoleManagerTest.cs @@ -11,13 +11,13 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public void ConstructorThrowsWithNullStore() { - Assert.Throws("store", () => new RoleManager(null)); + Assert.Throws("store", () => new RoleManager(null)); } [Fact] public void RolesQueryableFailWhenStoreNotImplemented() { - var manager = new RoleManager(new NoopRoleStore()); + var manager = new RoleManager(new NoopRoleStore()); Assert.False(manager.SupportsQueryableRoles); Assert.Throws(() => manager.Roles.Count()); } @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public void DisposeAfterDisposeDoesNotThrow() { - var manager = new RoleManager(new NoopRoleStore()); + var manager = new RoleManager(new NoopRoleStore()); manager.Dispose(); manager.Dispose(); } @@ -34,8 +34,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task RoleManagerPublicNullChecks() { Assert.Throws("store", - () => new RoleManager(null)); - var manager = new RoleManager(new NotImplementedStore()); + () => new RoleManager(null)); + var manager = new RoleManager(new NotImplementedStore()); await Assert.ThrowsAsync("role", async () => await manager.Create(null)); await Assert.ThrowsAsync("role", async () => await manager.Update(null)); await Assert.ThrowsAsync("role", async () => await manager.Delete(null)); @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task RoleStoreMethodsThrowWhenDisposed() { - var manager = new RoleManager(new NoopRoleStore()); + var manager = new RoleManager(new NoopRoleStore()); manager.Dispose(); await Assert.ThrowsAsync(() => manager.FindById(null)); await Assert.ThrowsAsync(() => manager.FindByName(null)); @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Identity.Test await Assert.ThrowsAsync(() => manager.Delete(null)); } - private class NotImplementedStore : IRoleStore + private class NotImplementedStore : IRoleStore { public Task Create(TestRole role, CancellationToken cancellationToken = default(CancellationToken)) { @@ -73,6 +73,16 @@ namespace Microsoft.AspNet.Identity.Test throw new NotImplementedException(); } + public Task GetRoleId(TestRole role, CancellationToken cancellationToken = new CancellationToken()) + { + throw new NotImplementedException(); + } + + public Task GetRoleName(TestRole role, CancellationToken cancellationToken = new CancellationToken()) + { + throw new NotImplementedException(); + } + public Task FindById(string roleId, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); diff --git a/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs b/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs index 867d68747d..4bf573a88d 100644 --- a/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/RoleValidatorTest.cs @@ -10,8 +10,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task ValidateThrowsWithNull() { // Setup - var manager = new RoleManager(new NoopRoleStore()); - var validator = new RoleValidator(); + var manager = new RoleManager(new NoopRoleStore()); + var validator = new RoleValidator(); // Act // Assert @@ -25,8 +25,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task ValidateFailsWithTooShortRoleName(string input) { // Setup - var manager = new RoleManager(new NoopRoleStore()); - var validator = new RoleValidator(); + var manager = new RoleManager(new NoopRoleStore()); + var validator = new RoleValidator(); var user = new TestRole {Name = input}; // Act diff --git a/test/Microsoft.AspNet.Identity.Test/TestRole.cs b/test/Microsoft.AspNet.Identity.Test/TestRole.cs index e171025596..c70074e769 100644 --- a/test/Microsoft.AspNet.Identity.Test/TestRole.cs +++ b/test/Microsoft.AspNet.Identity.Test/TestRole.cs @@ -1,6 +1,6 @@ namespace Microsoft.AspNet.Identity.Test { - public class TestRole : IRole + public class TestRole { public string Id { get; private set; } public string Name { get; set; } diff --git a/test/Microsoft.AspNet.Identity.Test/TestServices.cs b/test/Microsoft.AspNet.Identity.Test/TestServices.cs index 65706213cf..acc1f1d59c 100644 --- a/test/Microsoft.AspNet.Identity.Test/TestServices.cs +++ b/test/Microsoft.AspNet.Identity.Test/TestServices.cs @@ -9,15 +9,14 @@ namespace Microsoft.AspNet.Identity.Test public static class TestServices { public static IEnumerable DefaultServices() - where TUser : class, IUser - where TKey : IEquatable + where TUser : class { var describer = new ServiceDescriber(); yield return describer.Transient(); - yield return describer.Transient, UserValidator>(); + yield return describer.Transient, UserValidator>(); yield return describer.Transient(); - yield return describer.Transient, ClaimsIdentityFactory>(); - yield return describer.Transient, NoopUserStore>(); + yield return describer.Transient, ClaimsIdentityFactory>(); + yield return describer.Transient, NoopUserStore>(); } } diff --git a/test/Microsoft.AspNet.Identity.Test/TestUser.cs b/test/Microsoft.AspNet.Identity.Test/TestUser.cs index cf4d975f0d..1b35c8dd78 100644 --- a/test/Microsoft.AspNet.Identity.Test/TestUser.cs +++ b/test/Microsoft.AspNet.Identity.Test/TestUser.cs @@ -2,17 +2,14 @@ using System; namespace Microsoft.AspNet.Identity.Test { - public class TestUser : TestUser + public class TestUser { public TestUser() { Id = Guid.NewGuid().ToString(); } - } - public class TestUser : IUser - { - public TKey Id { get; set; } + public string Id { get; set; } public string UserName { get; set; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs index ea9788c953..32e40a73f8 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs @@ -13,9 +13,9 @@ namespace Microsoft.AspNet.Identity.Test { public class UserManagerTest { - private class TestManager : UserManager + private class TestManager : UserManager { - public IUserStore StorePublic { get { return base.Store; } } + public IUserStore StorePublic { get { return base.Store; } } public TestManager(IServiceProvider provider) : base(provider) { } } @@ -36,11 +36,11 @@ namespace Microsoft.AspNet.Identity.Test public async Task CreateCallsStore() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser { UserName = "Foo" }; store.Setup(s => s.Create(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - var validator = new Mock>(); - var userManager = new UserManager(store.Object); + var validator = new Mock>(); + var userManager = new UserManager(store.Object); validator.Setup(v => v.Validate(userManager, user, CancellationToken.None)).Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); userManager.UserValidator = validator.Object; @@ -56,10 +56,10 @@ namespace Microsoft.AspNet.Identity.Test public async Task DeleteCallsStore() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser { UserName = "Foo" }; store.Setup(s => s.Delete(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - var userManager = new UserManager(store.Object); + var userManager = new UserManager(store.Object); // Act var result = await userManager.Delete(user); @@ -73,11 +73,11 @@ namespace Microsoft.AspNet.Identity.Test public async Task UpdateCallsStore() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser { UserName = "Foo" }; store.Setup(s => s.Update(user, CancellationToken.None)).Returns(Task.FromResult(0)).Verifiable(); - var validator = new Mock>(); - var userManager = new UserManager(store.Object); + var validator = new Mock>(); + var userManager = new UserManager(store.Object); validator.Setup(v => v.Validate(userManager, user, CancellationToken.None)).Returns(Task.FromResult(IdentityResult.Success)).Verifiable(); userManager.UserValidator = validator.Object; @@ -93,10 +93,10 @@ namespace Microsoft.AspNet.Identity.Test public async Task FindByIdCallsStore() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser { UserName = "Foo" }; store.Setup(s => s.FindById(user.Id, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); - var userManager = new UserManager(store.Object); + var userManager = new UserManager(store.Object); // Act var result = await userManager.FindById(user.Id); @@ -110,10 +110,10 @@ namespace Microsoft.AspNet.Identity.Test public async Task FindByNameCallsStore() { // Setup - var store = new Mock>(); + var store = new Mock>(); var user = new TestUser {UserName="Foo"}; store.Setup(s => s.FindByName(user.UserName, CancellationToken.None)).Returns(Task.FromResult(user)).Verifiable(); - var userManager = new UserManager(store.Object); + var userManager = new UserManager(store.Object); // Act var result = await userManager.FindByName(user.UserName); @@ -128,21 +128,21 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task CheckPasswordWithNullUserReturnsFalse() { - var manager = new UserManager(new EmptyStore()); + var manager = new UserManager(new EmptyStore()); Assert.False(await manager.CheckPassword(null, "whatevs")); } [Fact] public async Task FindWithUnknownUserAndPasswordReturnsNull() { - var manager = new UserManager(new EmptyStore()); + var manager = new UserManager(new EmptyStore()); Assert.Null(await manager.Find("bogus", "whatevs")); } [Fact] public void UsersQueryableFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsQueryableUsers); Assert.Throws(() => manager.Users.Count()); } @@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task UsersEmailMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserEmail); await Assert.ThrowsAsync(() => manager.FindByEmail(null)); await Assert.ThrowsAsync(() => manager.SetEmail(null, null)); @@ -162,7 +162,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task UsersPhoneNumberMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserPhoneNumber); await Assert.ThrowsAsync(async () => await manager.SetPhoneNumber(null, null)); await Assert.ThrowsAsync(async () => await manager.SetPhoneNumber(null, null)); @@ -172,7 +172,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task TokenMethodsThrowWithNoTokenProvider() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); await Assert.ThrowsAsync( async () => await manager.GenerateUserToken(null, null)); await Assert.ThrowsAsync( @@ -182,7 +182,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task PasswordMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserPassword); await Assert.ThrowsAsync(() => manager.Create(null, null)); await Assert.ThrowsAsync(() => manager.ChangePassword(null, null, null)); @@ -195,7 +195,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task SecurityStampMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserSecurityStamp); await Assert.ThrowsAsync(() => manager.UpdateSecurityStamp("bogus")); await Assert.ThrowsAsync(() => manager.GetSecurityStamp("bogus")); @@ -210,7 +210,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task LoginMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserLogin); await Assert.ThrowsAsync(async () => await manager.AddLogin("bogus", null)); await Assert.ThrowsAsync(async () => await manager.RemoveLogin("bogus", null)); @@ -221,7 +221,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task ClaimMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserClaim); await Assert.ThrowsAsync(async () => await manager.AddClaim("bogus", null)); await Assert.ThrowsAsync(async () => await manager.RemoveClaim("bogus", null)); @@ -231,7 +231,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task TwoFactorStoreMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserTwoFactor); await Assert.ThrowsAsync(async () => await manager.GetTwoFactorEnabled("bogus")); await @@ -241,7 +241,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task LockoutStoreMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserLockout); await Assert.ThrowsAsync(async () => await manager.GetLockoutEnabled("bogus")); await Assert.ThrowsAsync(async () => await manager.SetLockoutEnabled("bogus", true)); @@ -254,7 +254,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task RoleMethodsFailWhenStoreNotImplemented() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); Assert.False(manager.SupportsUserRole); await Assert.ThrowsAsync(async () => await manager.AddToRole("bogus", null)); await Assert.ThrowsAsync(async () => await manager.GetRoles("bogus")); @@ -265,7 +265,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public void DisposeAfterDisposeDoesNotThrow() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); manager.Dispose(); manager.Dispose(); } @@ -274,7 +274,7 @@ namespace Microsoft.AspNet.Identity.Test public async Task PasswordValidatorBlocksCreate() { // TODO: Can switch to Mock eventually - var manager = new UserManager(new EmptyStore()) + var manager = new UserManager(new EmptyStore()) { PasswordValidator = new BadPasswordValidtor() }; @@ -286,10 +286,10 @@ namespace Microsoft.AspNet.Identity.Test public async Task ManagerPublicNullChecks() { Assert.Throws("store", - () => new UserManager((IUserStore) null)); + () => new UserManager((IUserStore) null)); Assert.Throws("serviceProvider", - () => new UserManager((IServiceProvider)null)); - var manager = new UserManager(new NotImplementedStore()); + () => new UserManager((IServiceProvider)null)); + var manager = new UserManager(new NotImplementedStore()); Assert.Throws(() => manager.ClaimsIdentityFactory = null); Assert.Throws(() => manager.PasswordHasher = null); await @@ -317,7 +317,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task MethodsFailWithUnknownUserTest() { - var manager = new UserManager(new EmptyStore()) + var manager = new UserManager(new EmptyStore()) { UserTokenProvider = new NoOpTokenProvider() }; @@ -413,7 +413,7 @@ namespace Microsoft.AspNet.Identity.Test [Fact] public async Task MethodsThrowWhenDisposedTest() { - var manager = new UserManager(new NoopUserStore()); + var manager = new UserManager(new NoopUserStore()); manager.Dispose(); Assert.Throws(() => manager.ClaimsIdentityFactory); await Assert.ThrowsAsync(() => manager.AddClaim("bogus", null)); @@ -459,15 +459,15 @@ namespace Microsoft.AspNet.Identity.Test } private class EmptyStore : - IUserPasswordStore, - IUserClaimStore, - IUserLoginStore, - IUserEmailStore, - IUserPhoneNumberStore, - IUserLockoutStore, - IUserTwoFactorStore, - IUserRoleStore, - IUserSecurityStampStore + IUserPasswordStore, + IUserClaimStore, + IUserLoginStore, + IUserEmailStore, + IUserPhoneNumberStore, + IUserLockoutStore, + IUserTwoFactorStore, + IUserRoleStore, + IUserSecurityStampStore { public Task> GetClaims(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { @@ -667,40 +667,50 @@ namespace Microsoft.AspNet.Identity.Test { return Task.FromResult(false); } + + public Task GetUserId(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + { + return Task.FromResult(null); + } + + public Task GetUserName(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + { + return Task.FromResult(null); + } } - private class NoOpTokenProvider : IUserTokenProvider + private class NoOpTokenProvider : IUserTokenProvider { - public Task Generate(string purpose, UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Generate(string purpose, UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult("Test"); } - public Task Validate(string purpose, string token, UserManager manager, + public Task Validate(string purpose, string token, UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(true); } - public Task Notify(string token, UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task Notify(string token, UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } - public Task IsValidProviderForUser(UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task IsValidProviderForUser(UserManager manager, TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(true); } } private class NotImplementedStore : - IUserPasswordStore, - IUserClaimStore, - IUserLoginStore, - IUserEmailStore, - IUserPhoneNumberStore, - IUserLockoutStore, - IUserTwoFactorStore + IUserPasswordStore, + IUserClaimStore, + IUserLoginStore, + IUserEmailStore, + IUserPhoneNumberStore, + IUserLockoutStore, + IUserTwoFactorStore { public Task> GetClaims(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { @@ -802,6 +812,16 @@ namespace Microsoft.AspNet.Identity.Test throw new NotImplementedException(); } + public Task GetUserId(TestUser user, CancellationToken cancellationToken = new CancellationToken()) + { + throw new NotImplementedException(); + } + + public Task GetUserName(TestUser user, CancellationToken cancellationToken = new CancellationToken()) + { + throw new NotImplementedException(); + } + public Task Create(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); diff --git a/test/Microsoft.AspNet.Identity.Test/UserValidatorTest.cs b/test/Microsoft.AspNet.Identity.Test/UserValidatorTest.cs index 7b16aad2d0..b4103187f8 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserValidatorTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserValidatorTest.cs @@ -10,8 +10,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task ValidateThrowsWithNull() { // Setup - var manager = new UserManager(new NoopUserStore()); - var validator = new UserValidator(); + var manager = new UserManager(new NoopUserStore()); + var validator = new UserValidator(); // Act // Assert @@ -25,8 +25,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task ValidateFailsWithTooShortUserNames(string input) { // Setup - var manager = new UserManager(new NoopUserStore()); - var validator = new UserValidator(); + var manager = new UserManager(new NoopUserStore()); + var validator = new UserValidator(); var user = new TestUser {UserName = input}; // Act @@ -45,8 +45,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task DefaultAlphaNumericOnlyUserNameValidation(string userName, bool expectSuccess) { // Setup - var manager = new UserManager(new NoopUserStore()); - var validator = new UserValidator(); + var manager = new UserManager(new NoopUserStore()); + var validator = new UserValidator(); var user = new TestUser {UserName = userName}; // Act @@ -72,8 +72,8 @@ namespace Microsoft.AspNet.Identity.Test public async Task CanAllowNonAlphaNumericUserName(string userName, bool expectSuccess) { // Setup - var manager = new UserManager(new NoopUserStore()); - var validator = new UserValidator {AllowOnlyAlphanumericUserNames = false}; + var manager = new UserManager(new NoopUserStore()); + var validator = new UserValidator {AllowOnlyAlphanumericUserNames = false}; var user = new TestUser {UserName = userName}; // Act