Связывание модели с хешированным паролем в ASP.NET MVC 3 с Entity Framework 4.1 - PullRequest
2 голосов
/ 28 июня 2011

Я пытаюсь создать приложение ASP.NET MVC с использованием подхода, основанного на коде, в Entity Framework 4.1, и меня немного смущает, как обрабатывать проверку в следующем сценарии:

Допустим, у меня есть простой класс User, использующий DataAnnotations для проверки:

public class User
{
    public int UserId { get; set; }

    [Required]
    [StringLength(500)]
    public string Email { get; set; }

    [Required]
    [StringLength(50)]
    public string Salt { get; set; }

    [Required]
    [StringLength(50)]
    public string HashedPassword { get; set; }

    public void SetPassword(string password)
    {
        if (string.IsNullOrWhiteSpace(Salt))
            Salt = Guid.NewGuid().ToString();

        HashedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(string.Concat(password, Salt), "sha1");
    }
}

Обратите внимание, что здесь для вызывающих абонентов предполагается использовать процедуру SetPassword, чтобы установить пароль для объекта User. Это автоматически сгенерирует соль, если ее не существует, и использует ее для хеширования пароля для хранения в базе данных.

Теперь предположим, что я создаю UsersController следующим образом:

public class UsersController : Controller
{
    [HttpGet]
    public ActionResult Register()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Register(User user)
    {
        if (!ModelState.IsValid)
            return View(user);

        // Save user to database

        return RedirectToAction("Index", "Home");
    }
}

Мои вопросы:

  1. Моя форма будет содержать поля для имени пользователя, адреса электронной почты и пароля. Имя пользователя и адрес электронной почты должны отображаться на «пользователя» просто отлично через связыватель модели по умолчанию. Но как мне заставить механизм связывания взять введенный пароль и вызвать с ним мою функцию SetPassword? Нужно ли использовать для этой цели специальную модель? Если так, как я могу гарантировать, что проверки DataAnnotation все еще выполняются?
  2. Мне бы очень хотелось, чтобы свойства Salt и HashedPassword в моем классе User были доступны только для чтения. Есть ли способ сделать это, который все еще позволяет Entity Framework устанавливать эти свойства при загрузке пользователя из базы данных?

1 Ответ

0 голосов
/ 28 июня 2011

В идеале процесс генерации пароля не принадлежит ViewModel, он должен быть частью модели вашего домена. Привязке модели по умолчанию требуется, чтобы данные, которые использовались для заполнения в модели, были доступны в FormsCollection, когда происходит публикация формы.

...