Pass user to IPasswordHasher
This commit is contained in:
parent
7f2ae65e3d
commit
7942d2bc82
|
|
@ -6,21 +6,23 @@ namespace Microsoft.AspNet.Identity
|
|||
/// <summary>
|
||||
/// Abstraction for password hashing methods
|
||||
/// </summary>
|
||||
public interface IPasswordHasher
|
||||
public interface IPasswordHasher<TUser> where TUser : class
|
||||
{
|
||||
/// <summary>
|
||||
/// Hash a password
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <param name="password"></param>
|
||||
/// <returns></returns>
|
||||
string HashPassword(string password);
|
||||
string HashPassword(TUser user, string password);
|
||||
|
||||
/// <summary>
|
||||
/// Verify that a password matches the hashed password
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <param name="hashedPassword"></param>
|
||||
/// <param name="providedPassword"></param>
|
||||
/// <returns></returns>
|
||||
PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword);
|
||||
PasswordVerificationResult VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword);
|
||||
}
|
||||
}
|
||||
|
|
@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Identity
|
|||
|
||||
yield return describe.Transient<IUserValidator<TUser>, UserValidator<TUser>>();
|
||||
yield return describe.Transient<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
|
||||
yield return describe.Transient<IPasswordHasher, PasswordHasher>();
|
||||
yield return describe.Transient<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
|
||||
|
||||
// TODO: rationalize email/sms/usertoken services
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,14 +6,15 @@ namespace Microsoft.AspNet.Identity
|
|||
/// <summary>
|
||||
/// Implements password hashing methods
|
||||
/// </summary>
|
||||
public class PasswordHasher : IPasswordHasher
|
||||
public class PasswordHasher<TUser> : IPasswordHasher<TUser> where TUser : class
|
||||
{
|
||||
/// <summary>
|
||||
/// Hash a password
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <param name="password"></param>
|
||||
/// <returns></returns>
|
||||
public virtual string HashPassword(string password)
|
||||
public virtual string HashPassword(TUser user, string password)
|
||||
{
|
||||
return Crypto.HashPassword(password);
|
||||
}
|
||||
|
|
@ -21,10 +22,11 @@ namespace Microsoft.AspNet.Identity
|
|||
/// <summary>
|
||||
/// Verify that a password matches the hashedPassword
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <param name="hashedPassword"></param>
|
||||
/// <param name="providedPassword"></param>
|
||||
/// <returns></returns>
|
||||
public virtual PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
|
||||
public virtual PasswordVerificationResult VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword)
|
||||
{
|
||||
return Crypto.VerifyHashedPassword(hashedPassword, providedPassword)
|
||||
? PasswordVerificationResult.Success
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Identity
|
|||
|
||||
private TimeSpan _defaultLockout = TimeSpan.Zero;
|
||||
private bool _disposed;
|
||||
private IPasswordHasher _passwordHasher;
|
||||
private IPasswordHasher<TUser> _passwordHasher;
|
||||
private IdentityOptions _options;
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -37,7 +37,7 @@ namespace Microsoft.AspNet.Identity
|
|||
/// <param name="passwordValidator"></param>
|
||||
/// <param name="claimsIdentityFactory"></param>
|
||||
public UserManager(IUserStore<TUser> store, IOptionsAccessor<IdentityOptions> optionsAccessor,
|
||||
IPasswordHasher passwordHasher, IUserValidator<TUser> userValidator,
|
||||
IPasswordHasher<TUser> passwordHasher, IUserValidator<TUser> userValidator,
|
||||
IPasswordValidator<TUser> passwordValidator)
|
||||
{
|
||||
if (store == null)
|
||||
|
|
@ -68,7 +68,7 @@ namespace Microsoft.AspNet.Identity
|
|||
/// <summary>
|
||||
/// Used to hash/verify passwords
|
||||
/// </summary>
|
||||
public IPasswordHasher PasswordHasher
|
||||
public IPasswordHasher<TUser> PasswordHasher
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
@ -618,7 +618,7 @@ namespace Microsoft.AspNet.Identity
|
|||
}
|
||||
}
|
||||
await
|
||||
passwordStore.SetPasswordHashAsync(user, PasswordHasher.HashPassword(newPassword), cancellationToken);
|
||||
passwordStore.SetPasswordHashAsync(user, PasswordHasher.HashPassword(user, newPassword), cancellationToken);
|
||||
await UpdateSecurityStampInternal(user, cancellationToken);
|
||||
return IdentityResult.Success;
|
||||
}
|
||||
|
|
@ -635,7 +635,7 @@ namespace Microsoft.AspNet.Identity
|
|||
string password, CancellationToken cancellationToken = default(CancellationToken))
|
||||
{
|
||||
var hash = await store.GetPasswordHashAsync(user, cancellationToken);
|
||||
return PasswordHasher.VerifyHashedPassword(hash, password) != PasswordVerificationResult.Failed;
|
||||
return PasswordHasher.VerifyHashedPassword(user, hash, password) != PasswordVerificationResult.Failed;
|
||||
}
|
||||
|
||||
// IUserSecurityStampStore methods
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test
|
|||
var user = new IdentityUser("CanUpdatePasswordUsingHasher");
|
||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "password"));
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword("New");
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword(user, "New");
|
||||
IdentityResultAssert.IsSuccess(await manager.UpdateAsync(user));
|
||||
Assert.False(await manager.CheckPasswordAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "New"));
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.Test
|
|||
var user = new ApplicationUser();
|
||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "password"));
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword("New");
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword(user, "New");
|
||||
IdentityResultAssert.IsSuccess(await manager.UpdateAsync(user));
|
||||
Assert.False(await manager.CheckPasswordAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "New"));
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
[Fact]
|
||||
public void CanSpecifyPasswordHasherInstance()
|
||||
{
|
||||
CanOverride<IPasswordHasher>(new PasswordHasher());
|
||||
CanOverride<IPasswordHasher<IdentityUser>>(new PasswordHasher<IdentityUser>());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
var pwdValidator = provider.GetService<IPasswordValidator<IdentityUser>>() as PasswordValidator<IdentityUser>;
|
||||
Assert.NotNull(pwdValidator);
|
||||
|
||||
var hasher = provider.GetService<IPasswordHasher>() as PasswordHasher;
|
||||
var hasher = provider.GetService<IPasswordHasher<IdentityUser>>() as PasswordHasher<IdentityUser>;
|
||||
Assert.NotNull(hasher);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
public IUserStore<TestUser> StorePublic { get { return Store; } }
|
||||
|
||||
public TestManager(IUserStore<TestUser> store, IOptionsAccessor<IdentityOptions> optionsAccessor,
|
||||
IPasswordHasher passwordHasher, IUserValidator<TestUser> userValidator,
|
||||
IPasswordHasher<TestUser> passwordHasher, IUserValidator<TestUser> userValidator,
|
||||
IPasswordValidator<TestUser> passwordValidator)
|
||||
: base(store, optionsAccessor, passwordHasher, userValidator, passwordValidator) { }
|
||||
}
|
||||
|
|
@ -423,7 +423,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
{
|
||||
var store = new NotImplementedStore();
|
||||
var optionsAccessor = new OptionsAccessor<IdentityOptions>(null);
|
||||
var passwordHasher = new PasswordHasher();
|
||||
var passwordHasher = new PasswordHasher<TestUser>();
|
||||
var userValidator = new UserValidator<TestUser>();
|
||||
var passwordValidator = new PasswordValidator<TestUser>();
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
public class ApplicationUserManager : UserManager<ApplicationUser>
|
||||
{
|
||||
public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptionsAccessor<IdentityOptions> options,
|
||||
IPasswordHasher passwordHasher, IUserValidator<ApplicationUser> userValidator,
|
||||
IPasswordHasher<ApplicationUser> passwordHasher, IUserValidator<ApplicationUser> userValidator,
|
||||
IPasswordValidator<ApplicationUser> passwordValidator)
|
||||
: base(store, options, passwordHasher, userValidator, passwordValidator) { }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
{
|
||||
var store = new Mock<IUserStore<TUser>>();
|
||||
var options = new OptionsAccessor<IdentityOptions>(null);
|
||||
return new Mock<UserManager<TUser>>(store.Object, options, new PasswordHasher(), new UserValidator<TUser>(), new PasswordValidator<TUser>());
|
||||
return new Mock<UserManager<TUser>>(store.Object, options, new PasswordHasher<TUser>(), new UserValidator<TUser>(), new PasswordValidator<TUser>());
|
||||
}
|
||||
|
||||
public static Mock<RoleManager<TRole>> MockRoleManager<TRole>() where TRole : class
|
||||
|
|
@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
{
|
||||
var options = new OptionsAccessor<IdentityOptions>(null);
|
||||
var validator = new Mock<UserValidator<TUser>>();
|
||||
var userManager = new UserManager<TUser>(store, options, new PasswordHasher(), validator.Object, new PasswordValidator<TUser>());
|
||||
var userManager = new UserManager<TUser>(store, options, new PasswordHasher<TUser>(), validator.Object, new PasswordValidator<TUser>());
|
||||
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>(), CancellationToken.None)).Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
|
||||
return userManager;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Identity.Test
|
|||
var user = new TUser() { UserName = "UpdatePassword" };
|
||||
IdentityResultAssert.IsSuccess(await manager.CreateAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "password"));
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword("New");
|
||||
user.PasswordHash = manager.PasswordHasher.HashPassword(user, "New");
|
||||
IdentityResultAssert.IsSuccess(await manager.UpdateAsync(user));
|
||||
Assert.False(await manager.CheckPasswordAsync(user, "password"));
|
||||
Assert.True(await manager.CheckPasswordAsync(user, "New"));
|
||||
|
|
|
|||
Loading…
Reference in New Issue