1

ユーザーが自分のアカウントの詳細を更新できるようにしたいと考えています。簡単にするために、アカウント モデルがIDNameSurnameUsername、およびで構成されPasswordており、ユーザーが および のみを変更できるようにしたいとしNameますSurnameID問題は、アカウント モデルをビューに渡すと、 、Username、およびの非表示フィールドを作成する必要があることPasswordです。このデータを暗号化することはできますが、パスワードをビューに入れることは安全ではありません。

別のアプローチは、およびのみEditAccountを含むビューモデルを作成することですが、コントローラーアクションでは、変更されているユーザーを再度検索し、保存する前に手動で新しいおよびを割り当てる必要があります。これは特にきちんとしたアプローチではありません. このようなシナリオで何か提案はありますか?IDNameSurnameNameSurname

4

1 に答える 1

2

含まれていない別のViewModelを確実に作成し、Passwordそれを編集ビューに送信してください。特定のニーズに対して特定の ViewModel を使用することは、まったく普通のことです。それがViewModelの目的です。軽量で再利用可能です。これらは、UI のニーズに合わせてエンティティ データを再形成し、必要なものだけを含めることを目的としています。これは、MVC パターンに反するのではなく、MVC パターンで機能するため、推奨される方法です。

必要に応じて、非機密データの ViewModel と、ユーザーのパスワードを変更する必要がある場合に非機密を継承する機密データ用の 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これにより、すべてのプロパティが 1 か所にあり、編集ではなく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);
}
于 2012-06-10T15:07:25.810 に答える