Я пытаюсь создать веб-приложение с разделом администратора, в котором информация учетной записи может быть видна и отредактирована с использованием 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; }
}
}
Также дайте мне знать, если вам нужна дополнительная информация, которая может показаться уместной!
'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) –
Это неверно, если вы посмотрите на мой контроллер, я также привязываюсь к другой информации (EmployeeNumber, FirstName, LastName и т. Д.), И эта информация не будет отправлена в базу данных, если я оставлю 'db .Entry (applicationUser) .State = EntityState.Modified; ' и 'db.SaveChanges();' вне. Я даже попробовал это, чтобы подтвердить. – Jand
На самом деле я понял это, вы указали мне в правильном направлении, глядя на то, как я писал штамп безопасности, который теперь кажется довольно очевидным. Так что спасибо! – Jand