2016-07-22 1 views
1

Я пытаюсь создать веб-приложение с разделом администратора, в котором информация учетной записи может быть видна и отредактирована с использованием MVC, бритвы и структуры сущности (сначала код). Моя проблема заключается в том, что при попытке и сбросе пароля с помощью контроллера остальная информация учетной записи удаляется. Вот мой контроллерИнформация об учетной записи удаляется с помощью сброса пароля с изменения в пользовательском контроллере

// GET: Edit/5 
    public ActionResult Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     ApplicationUser applicationUser = db.Users.Find(id); 
     if (applicationUser == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(applicationUser); 
    } 

    // POST: Edit/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id, EmployeeNumber, FirstName, LastName, Department, Supervisor, Email, UserName, Password, Confirm Password")] ApplicationUser applicationUser) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByNameAsync(applicationUser.Email); 
      applicationUser.SecurityStamp = Guid.NewGuid().ToString("D"); 
      string resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var pass = Request["Password"]; 
      IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(user.Id, resetToken, Request["Password"]); 

      db.Entry(applicationUser).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(applicationUser); 
    } 

При отладке и пошаговое выполнение кода и глядя в базу данных, я вижу, что пароль хешируется и правильно хранить вплоть до db.SaveChanges();, после того, как перешагнув через эту линию пароль удаляется, но остальная часть информации сохраняется. Поэтому я решил, что, возможно, процесс восстановления пароля будет после того, как эта строка поможет, но затем дополнительная информация, которая была отредактирована, удаляется, а пароль сохраняется. Поэтому я не могу понять, почему это так. Я нашел другие сообщения, но они говорят, что решение состоит в том, чтобы либо закодировать токен, либо заменить пробелы на «+», либо на отметку времени, но, читая те, которые, похоже, правильный процесс сброса, который я пишу, мне кажется, что у меня здесь немного другая ситуация. Проверка маркера подходит так же успешно, как и во время всего процесса. Может быть, кто-то может пролить некоторое понимание и рассказать мне, почему у меня проблема, которую я испытываю? Было бы очень благодарно!

Я использую модель ApplicationUser, и это показано ниже.

namespace ReconciliationApp.Models 
{ 
    public class ApplicationUser : IdentityUser 
    { 
     public string EmployeeNumber { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Department { get; set; } 
     public string Supervisor { get; set; } 

     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() : base("ReconciliationContext") 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 

     public System.Data.Entity.DbSet<ReconciliationApp.Models.RegisterViewModel> RegisterViewModels { get; set; } 
    } 
} 

Также дайте мне знать, если вам нужна дополнительная информация, которая может показаться уместной!

+1

'db.Entry (applicationUser) .State = EntityState.Modified; и' db.SaveChanges(); 'не требуется. Почему вы пытаетесь обновить пользователя, если Asp.NET Identity уже делает это за вас? Если вам нужно изменить штамп безопасности, вы можете вызвать 'UserManager.UpdateSecurityStampAsync() - https://msdn.microsoft.com/en-us/library/dn497579%28v=vs.108%29.aspx?f=255&MSPPError = -2147217396) –

+0

Это неверно, если вы посмотрите на мой контроллер, я также привязываюсь к другой информации (EmployeeNumber, FirstName, LastName и т. Д.), И эта информация не будет отправлена ​​в базу данных, если я оставлю 'db .Entry (applicationUser) .State = EntityState.Modified; ' и 'db.SaveChanges();' вне. Я даже попробовал это, чтобы подтвердить. – Jand

+0

На самом деле я понял это, вы указали мне в правильном направлении, глядя на то, как я писал штамп безопасности, который теперь кажется довольно очевидным. Так что спасибо! – Jand

ответ

0

Я понял, мне кажется, что мне просто нужно было установить все индивидуально, а не все сразу. Я думаю, я просто пытался основать этот контроллер на некоторых контроллерах, которые я использую и использую. Вот мой рабочий код.

// POST: CSReconForms/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id, EmployeeNumber, FirstName, LastName, Department, Supervisor, Email, UserName, Password, Confirm Password")] ApplicationUser applicationUser) 
    { 
     if (ModelState.IsValid) 
     { 
      //UserManager.Create<applicationu>(); 
      var user = await UserManager.FindByNameAsync(applicationUser.Email); 
      //applicationUser.SecurityStamp = Guid.NewGuid().ToString("D"); 
      user.EmployeeNumber = applicationUser.EmployeeNumber; 
      user.FirstName = applicationUser.FirstName; 
      user.LastName = applicationUser.LastName; 
      user.Department = applicationUser.Department; 
      user.Supervisor = applicationUser.Supervisor; 

      string resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      var pass = Request["Password"]; 
      IdentityResult passwordChangeResult = await UserManager.ResetPasswordAsync(user.Id, resetToken, Request["Password"]); 

      return RedirectToAction("Index"); 
     } 
     return View(applicationUser); 
    }