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

snz8szmq  于 6个月前  发布在  .NET
关注(0)|答案(4)|浏览(82)

我被要求提供通过用户界面创建用户而不需要密码的能力,我正试图使用ASP.NET身份来实现这一点。
我可以使用UserManagerCreate方法成功创建一个没有密码的用户:

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


我多次尝试以具有NULLPasswordHash的测试用户身份登录。为此,我没有在登录表单中提供密码。因此,NULL密码被传递到PasswordSignInAsync方法中。此方法调用的返回值始终为SignInStatus.Failure
使用ASP.NET标识,当凭据包含NULL密码,而数据库中的用户包含NULLPasswordHash密码时,如何配置代码以正确地对用户凭据进行身份验证?

pieyvz9o

pieyvz9o1#

好的,你需要做的是使用你的数据库上下文找到用户(AspNetUsers用户)。在你有了用户之后,你可以检查他们的PasswordHash是否为空。如果是,那么就使用SignInManager.SignIn登录。如果不是,使用SignInManager.PasswordSignIn
联系我们

//alternatively, you can find the user using Email, Id or some other unique field
var user = db.AspNetUsers.FirstOrDefault(p => p.UserName); 
if (user != null)
{
    if (user.PasswordHash == null)
        await SignInManager.SignInAsync(user, true, true);
    else
        await SignInManager.PasswordSignInAsync(model.UserName, model.Password, 
            model.RememberMe, shouldLockout: false);
}

字符串
希望对你有帮助。

wpcxdonn

wpcxdonn2#

是的,你可以。ASP.NET标识框架是完全可定制的。只需像这样重写PasswordValidator.ValidateAsyncPasswordHasher.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();

rfbsl7qr

rfbsl7qr3#

我经常需要创建系统的第一个管理员用户(通常是我自己),这样我就可以为客户创建更多的帐户。
UserManager<AppUser>.CreateAsync(AppUser user)是正确的调用,因为您不想将密码放在代码/源代码控制中。
通过上述方法创建的用户账号没有其他人所说的PasswordHash,因此无法登录。
我要做的是到达应用程序站点,然后单击“忘记密码”(因为我也实现了该逻辑)。它将生成密码重置令牌,并向我的电子邮件发送一封电子邮件,其中包含我可以创建的链接,以返回应用程序重置我的密码。

vdgimpew

vdgimpew4#

我不认为你可以在没有密码的情况下验证用户。作为一个解决方案:在创建用户和验证凭据时,我建议使用C#代码中的一些虚拟/通用密码,而不是空密码。
创建用户时

if (vm.ShouldHavePassword)
{
    userManager.Create(userToInsert, vm.Password);
}
else
{
    userManager.Create(userToInsert, "someDummy123$");
}

字符串
验证时

result = await SignInManager.PasswordSignInAsync(model.UserName, "someDummy123$", model.RememberMe, shouldLockout: false);

相关问题