ASP.NET Core 身份验证 - 如何“手动”创建用户并提供密码哈希 - 如何正确生成哈希?

10

我必须手动创建用户:

var user = new User
{
    Name = "Joe",
    Email = "test@****.com",
    PasswordHash = "gdfgdfgre2132143xcxzvb=="
}

context.Users.Add(user);

但问题是,当我尝试登录该账户时,我的密码无效。

复制了我知道密码的用户帐户的密码哈希,然后将它粘贴到新的用户上,尝试使用相同的密码,但失败了 - 密码登录失败

所以我想问 - 我的逻辑有什么问题,如何使它起作用?

这与SecurityStamp有关吗?

1个回答

14

如果您想手动添加用户,则还应设置NormalizedUserName属性。此外,最好使用IPasswordHasher<TUser> Interface来散列密码:

注入的服务:

private readonly ApplicationDbContext _context;
public readonly IPasswordHasher<IdentityUser> _passwordHasher;

public HomeController( ApplicationDbContext dbContext, IPasswordHasher<IdentityUser> _passwordHasher)
{

    this._context = dbContext;
    this._passwordHasher = _passwordHasher;

}

我假设你的User继承了IdentityUser,这里我以IdentityUser为例:

IdentityUser applicationUser = new IdentityUser();
Guid guid = Guid.NewGuid();
applicationUser.Id = guid.ToString();
applicationUser.UserName = "Joe";
applicationUser.Email = "wx@hotmail.com";
applicationUser.NormalizedUserName = "wx@hotmail.com";

_context.Users.Add(applicationUser);


var hashedPassword = _passwordHasher.HashPassword(applicationUser, "YourPassword");
applicationUser.SecurityStamp = Guid.NewGuid().ToString();
applicationUser.PasswordHash = hashedPassword;

_context.SaveChanges();

您还可以使用 UserManager.CreateAsync 来使用指定的密码在后备存储中创建指定的用户:

var user = new IdentityUser { UserName = "Joe", Email = "wx@hotmail.com" };
var result = await _userManager.CreateAsync(user, "YourPassWord");
if (result.Succeeded)
{

}

注意:登录时应提供电子邮件值。


问题是,我正在测试中创建此帐户并注入所有这些真实的身份相关类对我来说很痛苦。 - Joelty
然后您可以使用手动方式,提供相关属性。 - Nan Yu
1
谢谢!显然创建PasswordHasher的实例不需要任何其他依赖项 - 一切都正常工作! - Joelty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接