使用ASP.NET标识创建无密码的用户

时间:2015-11-19 20:05:37

标签: asp.net asp.net-identity-2

我被要求提供通过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时,如何配置我的代码以正确验证用户凭据?这样的事情甚至可能吗?

3 个答案:

答案 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);