2

エンティティフレームワーク4.1のコードファーストアプローチを使用してASP.NET MVCアプリケーションを作成しようとしていますが、次のシナリオで検証を処理:ASP.NET MVC 3でエンティティフレームワーク4.1でハッシュされたパスワードをバインドするモデル

のは、私が検証のためにDataAnnotationsを使用して簡単なUserクラスがあるとしましょう:発信者が上のパスワードを設定するSetPasswordのルーチンを使用するためにここでの意図があることを

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"); 
    } 
} 

注意ユーザーオブジェクト。これは、Saltが存在しない場合はそれを自動生成し、データベースに保存するためにパスワードをハッシュするために使用します。

さて、私はこのようながUserControllerを作成しましょう:

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. 私はUserクラスのSaltとHashedPasswordプロパティを読み込み専用にしたいと思っています。 Entity Frameworkがデータベースからユーザーをロードするときにこれらのプロパティを設定できるようにする方法はありますか?

答えて

0

パスワードを生成するプロセスは、ViewModelに属さないのが理想的です。ドメインモデルの一部である必要があります。既定のモデルバインダーでは、フォームポストが発生したときにFormsCollectionで使用できるように、モデルに埋め込まれるデータが必要です。

関連する問題