Я пишу приложение ASP.NET MVC, которое обеспечит функциональность регистрации пользователей, но я не уверен, какая часть приложения (например, объект модели User Domain, Controller, ViewModelMappers) должна отвечать за хеширование пароля пользователя. У меня есть страница регистрации, которая использует строго типизированную ViewModel и действие Register в моем UserController, как показано ниже:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(UserRegisterViewModel userRegisterViewModel)
{
var user = userViewModelMapper.Map(userRegisterViewModel);
INotification validationResult = user.ValidateForRegistration(userRepository);
if (!validationResult.HasErrors)
{
user.HashPassword();
userRepository.AddOrUpdate(user); // i'm using NHibernate
return View("RegistrationAcknowledgement");
}
foreach (IError error in validationResult.Errors)
ModelState.AddModelError(error.Property, error.Message);
ViewData["country"] = new SelectList(countryRepository.GetAll(), "Code", "Name", userRegisterViewModel.Country);
return View("RegistrationForm", userRegisterViewModel);
}
Пользовательские объекты частично составлены объектами LoginDetail, как показано, и чтобы не подвергать внутренности объекта User сверх того, что абсолютно необходимо, свойство Password доступно только для чтения. Поэтому я не могу, например, сделать user.LoginDetails.Password = hashedandSaltedPassword;
namespace XXXX.Core.Model
{
public class User
{
private LoginDetails loginDetails;
public virtual LoginDetails LoginDetails
{
get { return loginDetails; }
private set { loginDetails = value; }
}
public virtual void AssignLoginDetails(LoginDetails loginDetails)
{
this.loginDetails = loginDetails;
}
public virtual void HashPassword()
{
IHashGenerator hashGenerator = new HashGenerator(new SaltGenerator());
IHashResult hashResult = hashGenerator.GenerateHash(loginDetails.Password, HashAlgoritm.SHA512);
loginDetails.Password = String.Concat(hashResult.HashValue, hashResult.Salt);
}
}
}
namespace XXXX.Core.Model
{
public class LoginDetails
{
private string username;
private string password;
private string confirmPassword;
private string passwordReminder;
private bool changePassword;
// Properties
#region Constructors
...
public LoginDetails(string username, string password, string confirmPassword, string passwordReminder, bool changePassword)
{
this.username = username;
this.password = password;
this.confirmPassword = confirmPassword;
this.passwordReminder = passwordReminder;
this.changePassword = changePassword;
}
}
}
В настоящее время ответственность за хеширование пароля лежит на пользователе (с помощью метода HashPassword), но
1. Является ли это правильной ответственностью за пользователя (в контексте DDD и принципа единой ответственности)
2. Если нет, то где должна находиться эта операция?
3. Если да, то должен ли он вызываться с контроллера, как я делаю?
Спасибо