Чувствительные объекты

Я хочу, чтобы мои пользователи могли обновлять данные своей учетной записи. Для упрощения предположим, что модель счета состоит из ID, Name, Surname, Username, а также Passwordи что я только хочу, чтобы пользователь мог изменить Name а также Surname, Проблема заключается в том, что если я передам модель учетной записи представлению, мне потребуется создать скрытые поля для ID, Username, а также Password, Теперь, хотя я могу зашифровать эти данные, ввод пароля в представлении небезопасен.

Альтернативный подход заключается в создании EditAccount модель представления, которая содержит ID, Name а также Surname только, но тогда в действии контроллера мне нужно будет снова искать изменяемого пользователя и вручную назначать новый Name а также Surname перед сохранением подход, который не особенно аккуратен. Есть ли у вас какие-либо предложения в подобных сценариях?

1 ответ

Решение

Определенно создайте отдельную ViewModel, которая не включает Password и отправьте это в окно редактирования. Совершенно нормально использовать определенные ViewModel для конкретных нужд. Вот для чего нужны ViewModels. Они легкие и многоразовые. Они предназначены для изменения данных вашей сущности в соответствии с потребностями пользовательского интерфейса, чтобы включить только то, что вам нужно. Это предпочтительный метод, так как он работает с шаблоном MVC, а не против него.

Если вы хотите, вы можете создать иерархию наследования, например, имеющую нечувствительные данные ViewModel и иерархию для конфиденциальных данных, которая наследует нечувствительные данные для нужд изменения пароля пользователя. Такие как:

Используйте это для редактирования пользователя:

public class UserEditViewModel {

    public int ID { get; set; }

    [Required]
    public string Name { get; set; }

    public string Surname { get; set; }
}

Используйте это, когда вам нужно User инфо плюс Password, Используйте эту модель, когда вы хотите разрешить пользователю редактировать свой пароль

public class SensitiveUserViewModel : UserEditViewModel {

    [Required]
    public string Username { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current Password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New Password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm New Password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match")]
    public string ConfirmPassword { get; set; }
}

Ваш вид, который выполнял редактирование, будет иметь следующие действия. Таким образом, редактирование нечувствительной пользовательской информации содержит только те данные, которые вам нужны, и с безопасностью проблем нет.

public ActionResult EditUser(int ID) {
    // get User by ID
    var model = new UserEditViewModel();
    // map your entity fields to ViewModel
    return View(model);
}

public ActionResult EditUser(UserEditViewModel model) {
    if(ModelState.IsValid) {
        // save user edits
    }
    return View(model);
}

Вы должны использовать отдельный вид, чтобы позволить пользователю редактировать информацию о пароле. Таким образом, вы можете использовать SensitiveUserViewModel Таким образом, у вас есть все данные, чувствительные и нечувствительные свойства. Это сохраняет все в чистоте, потому что все ваши свойства находятся в одном месте и используются только для изменения Password, не редактируя Name, Surname

public ActionResult ChangePassword(int ID) {
    // get user by ID
    var model = new SensitiveUserViewModel();
    // map your entity to ViewModel
    return View(model);
}

[HttpPost]
public ActionResult ChangePassword(SensitiveUserViewModel model) {
    if(ModelState.IsValid) {
        // save user password info
    }
    return View(model);
}
Другие вопросы по тегам