2016-07-07 10 views
1

おはよう、ASP.NET IDでUserManagerを更新するには?

私はasp.net Identity 2.0 MVC5でパスワードを作成し、ログイン時にパスワードを割り当てます。ユーザーに自分のアカウントを作成(更新)するように指示しました。

すべてが順調でしたが、ユーザーが更新を送信すると、データベースに反映されません。私のコードで正しいロジックが見当たりません。ここに私のViewModelとコントローラがあります。

お願いします、お願いします。

public class EditUserViewModel 
     { 
      [Key] 
      public string Id { get; set; } 

      [Required] 
      [Display(Name = "Surname")] 
      public string FirstName { get; set; } 

      [Required] 
      [Display(Name = "Last Name")] 
      public string LastName { get; set; } 

      [Required] 
      [Display(Name = "Username")] 
      public string Username { get; set; } 

      [Required] 
      [EmailAddress] 
      [Display(Name = "Email")] 
      public string Email { get; set; } 

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

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

      [Display(Name = "Gender")] 
      public string Gender { get; set; } 

      [Required] 
      [Display(Name = "Mobile Phone")] 
      public string PhoneNumber { get; set; } 

      //[Required] 
      [Display(Name = "Birthday - yyyy/mm/dd")] 
      public DateTime DateOfBirth { get; set; } 

      //public DateTime PostedDate { get; set; } 
     } 


    Controller: 
    [HttpGet, ActionName("profile")] 
      public ActionResult Edit() 
      { 

       return View(); 
      } 

      [HttpPost, ActionName("profile")] 
      [ValidateAntiForgeryToken] 
      public async Task<ActionResult> Edit(EditUserViewModel editUser) 
      { 
       if (ModelState.IsValid && TempData["Username"] != null) 
       { 
        var user = await UserManager.FindByNameAsync(editUser.Username); 

        if (user == null) 
        { 
         return HttpNotFound(); //change error later 
        } 
        user.FirstName = editUser.FirstName; 
        user.LastName = editUser.LastName; 
        user.UserName = editUser.Email; 
        user.Email = editUser.Email; 
        user.PasswordHash = editUser.Password; 


        var userUpdated = await UserManager.UpdateAsync(user); 

        if (!userUpdated.Succeeded) 
        { 
         ModelState.AddModelError("", userUpdated.Errors.First()); 
         return View(); 
        } 
        return RedirectToAction("index", "pages"); 
       } 
       ModelState.AddModelError("", "Something failed!!!"); 
       return View(); 
    } 

答えて

0

user.PasswordHashは、UserManagerによって特別に設定されたものとして使用することはできません。 uesrsパスワードをリセットするには、次のようなパスワードリセットトークンを生成する必要があります。

[HttpPost, ActionName("profile")] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Edit(EditUserViewModel editUser) 
{ 
    if (ModelState.IsValid && TempData["Username"] != null) 
    { 
     var user = await UserManager.FindByNameAsync(TempData["Username"] as string); 
     if (user == null) 
     { 
      return HttpNotFound(); //change error later 
     } 

     user.FirstName = editUser.FirstName; 
     user.LastName = editUser.LastName; 
     user.UserName = editUser.Email; 
     user.Email = editUser.Email; 

     var userUpdated = await UserManager.UpdateAsync(user); 

     if (!string.IsNullOrWhiteSpace(editUser.Password)) 
     { 
      UserManager.UserTokenProvider = new EmailTokenProvider<IdentityUser>(); 
      var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var result = await UserManager.ResetPasswordAsync(user.Id, resetToken, editUser.Password); 
     } 

     if (!userUpdated.Succeeded) 
     { 
      ModelState.AddModelError("", userUpdated.Errors.First()); 
      return View(); 
     } 
     return RedirectToAction("index", "pages"); 
    } 

    ModelState.AddModelError("", "Something failed!!!"); 
    return View(); 
} 
+0

ありがとうBobby Caldwell私はパスワードを忘れてしまった。しかし、デバッグ中にエラーが発生しました。var user = UserManager.FindByNameAsync(editUser.Username)がnullです。 –

+0

私は見るので、ユーザーはまだ作成されていないかもしれません。エラーを投げるのではなく、新しいユーザーを作成するだけですか?新しいユーザーが見つからない場合は、新しいユーザーを追加するように回答を更新します。 –

+0

私が達成したいのは、ユーザが自分のプロフィール(ファーストネーム、ラストネーム、ユーザ名、パスワードなど)を、私が彼らに与えたユーザ名とパスワードに対して更新できるページにログインした後にユーザを誘導することです。 –

関連する問題