使用 ASP.NET Identity 创建无密码用户

问题描述 投票:0回答:4

我被要求提供通过 UI 创建用户而无需密码的能力。我正在尝试使用 ASP.NET Identity 来完成此任务。

我能够使用

UserManager
Create
方法成功创建一个没有密码的用户:

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

调用

Create
方法后,测试用户成功保存到我们的
AspNetUsers
表中。当我不提供密码时,我们的
PasswordHash
表中的
AspNetUsers
列将设置为
NULL

我的问题是,我无法以没有密码的测试用户身份登录。以下是我们用来验证用户凭据的方法调用:

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

我尝试以测试用户身份登录,多次出现

NULL
PasswordHash
。为此,我不在登录表单中提供密码。结果,一个
NULL
密码被传递到
PasswordSignInAsync
方法中。该方法调用的返回值始终为
SignInStatus.Failure

使用 ASP.NET Identity,当凭据包含

NULL
密码并且数据库中的用户包含
NULL
PasswordHash
时,如何配置代码以正确验证用户凭据?这样的事有可能吗?

asp.net asp.net-identity-2
4个回答
13
投票

好吧,您需要做的是使用您的数据库上下文找到用户(

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

希望有帮助。


13
投票

是的,你可以。 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();

0
投票

我经常需要创建系统的第一个管理员用户(通常是我自己),以便我可以为客户创建更多帐户。

UserManager<AppUser>.CreateAsync(AppUser user)
是正确的选择,因为您不想将密码放入代码/源代码管理中。

通过上述方法创建的用户帐户没有

PasswordHash
,就像其他人提到的那样。因此您无法登录。

我要做的就是访问应用程序站点,然后单击“忘记密码”(因为我也实现了该逻辑)。它将生成一个密码重置令牌,并向我的电子邮件发送一封电子邮件,其中包含我可以创建的链接以返回应用程序以重置我的密码。


-5
投票

我认为您无法在没有密码的情况下验证用户。作为解决方法:我建议在创建用户和验证凭据时使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.