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