如何使用Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core身份手动哈希密码

时间:2019-04-23 21:02:08

标签: asp.net-core identityserver4 asp.net-core-identity

我正在将成千上万的用户从数据库中没有密码的旧网站迁移到该新的Web应用程序,但是,当我尝试使用async方法导入用户时,最终需要花费数个用户的时间几天后,我最终取消了它。

现在,我只能直接从_context.Users.Add创建新用户并分配他们的角色,我可以毫无问题地进行操作。但是,我似乎无法弄清楚如何创建通用密码(所有相同的密码),这些用户将只获得一个密码以查看直播(不需要超级安全),但我仍然需要用于通过客户端/管理员端处理其他内容的管理员帐户的安全性部分用户界面。如果用户登录,我将自动为其输入默认密码。

但是由于某种原因,我无法使密码哈希器正常工作,因为登录时会提示密码错误...

这就是我用来生成密码和创建用户的...

 var appUser = new ApplicationUser() {
  Id = GenerateId(),
   AccessFailedCount = 0,
   Email = user[1],
   PasswordHash = "",
   FullName = "Standard User",
   UserName = user[1],
   PhoneNumber = user[8],
   FirstName = user[2],
   LastName = user[3],
   JoinMailingList = user[4],
   Country = user[5],
   City = user[6],
   StateRegion = user[7]
 };

 _context.Users.Add(appUser);

 var options = new PasswordHasherOptions();
 options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2;

 var hasher = new PasswordHasher < ApplicationUser > ();
 appUser.PasswordHash = hasher.HashPassword(appUser, "Default8!");

 var role = _context.Roles.FirstOrDefault(r => r.Name == "user");

 if (role != null) {
  var userRole = new IdentityUserRole < string > ();
  userRole.RoleId = role.Id;
  userRole.UserId = appUser.Id;
  _context.UserRoles.Add(userRole);
 }
}

_context.SaveChanges();

有人可以帮助我解决如何将密码哈希存储到数据库中吗?

2 个答案:

答案 0 :(得分:2)

  

如果用户登录,我将自动为其输入默认密码。

如果您使用的是.net core身份,则可以使用UserManager.CreateAsync在后备存储中使用给定的密码创建指定的用户:

public virtual System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult> CreateAsync (TUser user, string password);

以下代码供您参考:

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

}

身份系统将帮助创建密码哈希并存储在数据库中。如果仍然需要手动对密码进行哈希处理,请参见IPasswordHasher interface


编辑:

如果要通过数据库上下文直接插入/更新,则应设置正确的NormalizedUserNameSecurityStamp以使系统正常工作:

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

_context.Users.Add(applicationUser);


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

_context.SaveChanges();

答案 1 :(得分:0)

此外,如果您只想更新给定用户的密码字段:

var oldUser = await _userManager.GetUserAsync(User);

var result = await _userManager.ChangePasswordAsync(oldUser,
                    updateUserVm.CurrentPassword,
                    updateUserVm.NewPassword);

还有一个问题示例:“我应该如何哈希密码?”。您可以使用UserManager引用的PasswordHasher哈希注册的用户密码,如下所示:

ApplicationUser user = _userManager.Users...;
user.PasswordHash = _userManager.PasswordHasher.HashPassword(user, newPassword);