Как вручную хешировать пароль с помощью Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core Identity - PullRequest
0 голосов
/ 24 апреля 2019

Я перемещаю десятки тысяч пользователей со старого веб-сайта, у которого не было пароля в базе данных, в это новое веб-приложение, однако, когда я пытаюсь импортировать пользователей с помощью асинхронного метода, в конечном итоге требуется несколько дней до того момента, когда я просто отменил его через несколько дней.

Теперь я прибегаю к тому, чтобы просто создавать новых пользователей напрямую из _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();

Может кто-нибудь помочь мне с тем, как я должен хешировать пароль для хранения в базе данных?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Если пользователь войдет в систему, он автоматически введет для него пароль по умолчанию.

Если вы используете .net core Identity, вы можете использовать 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 .


Редактировать:

Если вы хотите напрямую вставить / обновить через контекст базы данных, вы должны установить правильные NormalizedUserName и SecurityStamp, чтобы система работала:

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();
0 голосов
/ 24 апреля 2019

В качестве дополнения, если вы просто хотите обновить поле пароля данного пользователя:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...