如何使用Asp.Net Core 2.2 / IdentityServer4 / SP.NET核心标识手动散列密码

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

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

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

但由于某些原因,我无法让密码已正常工作,因为当我登录时,它说密码错误...

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

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

任何人都可以帮我解决我应该如何将密码存储到数据库中?

asp.net-core identityserver4 asp.net-core-identity
2个回答
2
投票

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

如果您使用.net核心标识,则可以使用UserManager.CreateAsync在后备存储中使用给定密码创建指定用户:

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

以下代码供您参考:

var user = new ApplicationUser { UserName = "[email protected]", Email = "[email protected]" };
var result = await _userManager.CreateAsync(user, "YourPassWord");
if (result.Succeeded)
{

}

Identity系统将帮助创建密码哈希并存储在数据库中。如果您仍需要手动哈希密码,请参阅IPasswordHasher interface


编辑:

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

ApplicationUser applicationUser = new ApplicationUser();
Guid guid = Guid.NewGuid();
applicationUser.Id = guid.ToString();
applicationUser.UserName = "[email protected]";
applicationUser.Email = "[email protected]";
applicationUser.NormalizedUserName = "[email protected]";

_context.Users.Add(applicationUser);


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

_context.SaveChanges();

0
投票

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

var oldUser = await _userManager.GetUserAsync(User);

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

并且问题的一个例子“我应该如何散列密码?”。您可以使用UserManager-Referenced PasswordHasher哈希注册的用户密码,如下所示:

ApplicationUser user = _userManager.Users...;
user.PasswordHash = _userManager.PasswordHasher.HashPassword(user, newPassword);
© www.soinside.com 2019 - 2024. All rights reserved.