ChangepasswordAsync不起作用

时间:2016-08-05 07:20:01

标签: c# asp.net asp.net-mvc identity

我用管理员面板的代码来改变客户的密码,我没有得到任何错误。但密码没有改变, 我从this

得到了我的男女同校
 [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);
    }

}

并在控制器中进行更改使用此

 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;
    }
}

我的错误是什么?

更新后回答我使用此方法

 [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;
    }

但又遇到了同样的问题

我在IdentityModels.cs中

 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; }

在正常模型中IdentityModel User未注册为DbSet ()

1 个答案:

答案 0 :(得分:0)

您还没有等待ChangePasswordAsync,您只是在检查它是否已完成。这可能导致在更改密码之前返回View。

然后你应该尝试使用async / await,如果可能的话。这意味着你的行动也应该是异步的。

 [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);
    }

}

评论后更新:

实体类型DbSet`1不是当前上下文模型的一部分

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

这是EF无法将您的模型连接到上下文中的实体。没有看到代码,很难确切地说出原因。但可能是您在上下文中遗漏了DbSet

您是否正确配置了UserManager?其他UserManager行动是否有效?

尝试调试并查看崩溃的位置。