我試圖創建一個管理部分的帳戶信息可以看到和編輯使用MVC,剃刀和實體框架(代碼優先)的Web應用程序。我的問題是,當我嘗試使用控制器重置密碼時,其餘帳戶信息被刪除。這裏是我的控制器帳戶信息正在從用戶控制器編輯中刪除密碼
// 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