我被要求提供通过 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
时,如何配置代码以正确验证用户凭据?这样的事有可能吗?
好吧,您需要做的是使用您的数据库上下文找到用户(
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);
}
希望有帮助。
是的,你可以。 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();
我经常需要创建系统的第一个管理员用户(通常是我自己),以便我可以为客户创建更多帐户。
UserManager<AppUser>.CreateAsync(AppUser user)
是正确的选择,因为您不想将密码放入代码/源代码管理中。
通过上述方法创建的用户帐户没有
PasswordHash
,就像其他人提到的那样。因此您无法登录。
我要做的就是访问应用程序站点,然后单击“忘记密码”(因为我也实现了该逻辑)。它将生成一个密码重置令牌,并向我的电子邮件发送一封电子邮件,其中包含我可以创建的链接以返回应用程序以重置我的密码。
我认为您无法在没有密码的情况下验证用户。作为解决方法:我建议在创建用户和验证凭据时使用 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);