我被要求提供通过UI创建用户而无需密码的能力。我试图使用ASP.NET身份完成此任务。
我可以使用UserManager的Create方法成功创建没有密码的用户:
if (vm.ShouldHavePassword)
{
userManager.Create(userToInsert, vm.Password);
}
else
{
userManager.Create(userToInsert);
}
调用Create方法后,测试用户成功保存到我们的AspNetUsers表中。当我不提供密码时,AspNetUsers表中的PasswordHash列设置为NULL。
我的问题是,我无法以没有密码的测试用户身份登录。以下是我们用于验证用户凭据的方法调用:
result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
我尝试以多次使用NULL PasswordHash的测试用户身份登录。为此,我不会在登录表单中提供密码。因此,将A NULL密码传递给PasswordSignInAsync方法。此方法调用的返回值始终为SignInStatus.Failure
。
使用ASP.NET标识,当凭据包含NULL密码并且数据库中的用户包含NULL PasswordHash时,如何配置我的代码以正确验证用户凭据?这样的事情甚至可能吗?
答案 0 :(得分:6)
是的,你可以。 Asp.Net Identity Framework完全可定制。只需覆盖PasswordValidator.ValidateAsync和PasswordHasher.VerifyHashedPassword方法,如下所示:
internal class CustomPasswordValidator: PasswordValidator
{
public override async Task<IdentityResult> ValidateAsync(string item)
{
if (string.IsNullOrEmpty(item)) return IdentityResult.Success;
return await base.ValidateAsync(item);
}
}
internal class CustomPasswordHasher : PasswordHasher
{
public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword)
{
if (hashedPassword == null && string.IsNullOrEmpty(providedPassword))
return PasswordVerificationResult.Success;
return base.VerifyHashedPassword(hashedPassword, providedPassword);
}
}
并将它们设置为:
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
manager.PasswordValidator = new CustomPasswordValidator();
manager.PasswordHasher = new CustomPasswordHasher();
答案 1 :(得分:5)
好的,您需要做的是使用db上下文找到用户(AspNetUsers用户)。获得用户后,您可以检查他们的PasswordHash是否为空。 如果是,那么只需使用SignInManager.SignIn唱出它们 如果没有,请使用SignInManager.PasswordSignIn
例如..
var user = db.AspNetUsers.FirstOrDefault(p=>p.UserName); //alternatively, you can find the user using Email, Id or some other unique field
if(user.PasswordHash == null)
await SignInManager.SignInAsync(user, true, true);
else
await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
希望它有所帮助。
答案 2 :(得分:0)
我认为您无法在没有密码的情况下验证用户。作为一种解决方法:我建议在创建用户和验证凭据时使用C#代码中的一些Dummy / Common密码而不是空白密码
创建用户时
if (vm.ShouldHavePassword)
{
userManager.Create(userToInsert, vm.Password);
}
else
{
userManager.Create(userToInsert, "someDummy123$");
}
验证时
result = await SignInManager.PasswordSignInAsync(model.UserName, "someDummy123$", model.RememberMe, shouldLockout: false);