2016-08-05 17 views
0

Ich habe diesen Code für Admin-Panel verwendet, um das Passwort des Kunden von Manager geändert, ich habe keinen Fehler erhalten. aber Passwort nicht geändert, ich habe meine Coed von thisChangepasswordAsync funktioniert nicht

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public virtual ActionResult ChangeUserPassword(SetPasswordViewModel model,string userId) 
    { 
     if (ModelState.IsValid) 
     { 
      //var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); 
      ApplicationUser appUser = db.Users.Find(userId); 
      var result = UserManager.ChangePasswordAsync(appUser, model.NewPassword); 
      if (result.IsCompleted) 
      { 
       var user = UserManager.FindById(User.Identity.GetUserId()); 
       //var user = db.Users.Find(userId); 
       if (user != null) 
       { 
        //await SignInManager<,>.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
       } 
       return RedirectToAction("Index", new { Message = ManageController.ManageMessageId.SetPasswordSuccess }); 
      } 
      // AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

} 

und in der Steuerung für den Wandel nutzen diese

public async Task<IdentityResult> ChangePasswordAsync(ApplicationUser Appuser, string newPassword) 
    { 
     var store = this.Store as Microsoft.AspNet.Identity.IUserPasswordStore<ApplicationUser,string>; 
     if (store == null) 
     { 
      var errors = new string[] 
      { 
      "Current UserStore doesn't implement IUserPasswordStore" 
      }; 
      return IdentityResult.Failed(errors); 
      // return Task.FromResult(new IdentityResult(errors) { Succeeded = false }); 

     } 

     var newPasswordHash = this.PasswordHasher.HashPassword(newPassword); 

     await store.SetPasswordHashAsync(Appuser, newPasswordHash); 
     await store.UpdateAsync(Appuser); 

     //return await Task.FromResult<IdentityResult>(IdentityResult.Success); 
     return IdentityResult.Success; 
    } 
} 

was mein Fehler?

nach dem Update Antwort verwende ich diese Methode anstelle

[HttpPost] 
    public async Task<IdentityResult> ChangePasswordAsync(ApplicationUser appuserId, string newPassword) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     //var userr =await db.Users.FirstOrDefaultAsync(x => x.Id == appuserId.Id); 

     var newPasswordHash = this.PasswordHasher.HashPassword(newPassword); 

     db.Entry(Users).State = EntityState.Modified; 
     if (appuserId != null) appuserId.PasswordHash = newPasswordHash; 
     db.SaveChanges(); 
     return IdentityResult.Success; 
    } 

aber hatte das gleiche Problem wieder

in IdentityModels.cs ich hatte

public DbSet<CommonAction> CommonActions { get; set; } 
    public DbSet<PublicContent> PublicContents { get; set; } 
    public DbSet<MainSubject> MainSubjects { get; set; } 
    public DbSet<EducationLevel> EducationLevels { get; set; } 
    public DbSet<TimePeriod> TimePeriods { get; set; } 
    public DbSet<HelpType> HelpTypes { get; set; } 
    public DbSet<FinancialSupport> FinancialSupports { get; set; } 
    public DbSet<LinksStatistic> LinksStatistics { get; set; } 
    public DbSet<SlideOfCommonAction> SlideOfCommonActions { get; set; } 

in normalen Modell IdentityModel Benutzer ist nicht registrieren als DbSet ()

+1

Vorsicht bei der Ausarbeitung des Downvotes? – smoksnes

+0

Was ist das Objekt 'Users' in der Zeile' db.Entry (Users) .State'? – smoksnes

+0

es ist das gleiche wie _ApplicationUser_ es ist gemein, wenn ich dieses 'public DbSet Benutzer {get; einstellen; } '.i hat diesen Fehler bekommen.' Mehrere Objektgruppen pro Typ werden nicht unterstützt. Die Objektgruppen 'Benutzer' und 'Benutzer' können beide Instanzen des Typs 'NGO.Models.ApplicationUser' enthalten. – sunny

Antwort

0

Sie sind nicht Warten auf ChangePasswordAsync, Sie überprüfen nur, ob es abgeschlossen ist oder nicht. Dies kann dazu führen, dass die View zurückgegeben wird, bevor das Passwort geändert wurde.

Dann sollten Sie versuchen, Async zu verwenden/erwarten den ganzen Weg, wenn möglich. Das bedeutet, dass Ihre Aktion auch asynchron sein sollte.

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public virtual async Task<ActionResult> ChangeUserPassword(SetPasswordViewModel model,string userId) 
    { 
     if (ModelState.IsValid) 
     { 
      //var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword); 
      ApplicationUser appUser = db.Users.Find(userId); 

      // await the result. 
      var result = await UserManager.ChangePasswordAsync(appUser, model.NewPassword); 
      if (result.Succeeded) // Or whatever you're expecting. 
      { 
       var user = UserManager.FindById(User.Identity.GetUserId()); 
       //var user = db.Users.Find(userId); 
       if (user != null) 
       { 
        //await SignInManager<,>.SignInAsync(user, isPersistent: false, rememberBrowser: false); 
       } 
       return RedirectToAction("Index", new { Message = ManageController.ManageMessageId.SetPasswordSuccess }); 
      } 
      // AddErrors(result); 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

}

Update nach Kommentare:

Die DbSet`1 Entitätstyp ist nicht Teil des Modells für den aktuellen Kontext

db.Entry(Users).State = EntityState.Modified; 

Dies ist, wenn EF kann Ihr Modell nicht mit einer Entität im Kontext verbinden. Ohne den Code zu sehen, ist es schwer, genau zu sagen, warum. Aber es könnte sein, dass Sie eine DbSet in Ihrem Kontext vermissen.

Haben Sie Ihre UserManager korrekt konfiguriert? Funktionieren die anderen UserManager Aktionen?

Versuchen Sie zu debuggen und zu sehen, wo es abstürzt.

+0

Danke, es ist in Ordnung, aber wenn ich auf Passwort ändern klicke, bekomme ich einen neuen Fehler – sunny

+0

Welchen Fehler bekommen Sie? – smoksnes

+0

"Der Entitätstyp DbSet'1 ist nicht Teil des Modells für den aktuellen Kontext." auf "db.Entry (Benutzer) .State = EntityState.Modified;" – sunny