Asp.net mvc 如何在ASP.NET标识中更新UserManager?

Asp.net mvc 如何在ASP.NET标识中更新UserManager?,asp.net-mvc,asp.net-identity-2,Asp.net Mvc,Asp.net Identity 2,你好 我在asp.net Identity 2.0 MVC5中创建并分配了一个用户,并在登录时使用密码;我指示用户创建(更新)他/她的帐户 一切进展顺利,但当用户提交更新时,它不会反映在数据库中。似乎我在代码中遗漏了正确的逻辑。这是我的视图模型和控制器 求你了,我需要你的帮助 public class EditUserViewModel { [Key] public string Id { get; set; }

你好

我在asp.net Identity 2.0 MVC5中创建并分配了一个用户,并在登录时使用密码;我指示用户创建(更新)他/她的帐户

一切进展顺利,但当用户提交更新时,它不会反映在数据库中。似乎我在代码中遗漏了正确的逻辑。这是我的视图模型和控制器

求你了,我需要你的帮助

    public class EditUserViewModel
        {
            [Key]
            public string Id { get; set; }

            [Required]
            [Display(Name = "Surname")]
            public string FirstName { get; set; }

            [Required]
            [Display(Name = "Last Name")]
            public string LastName { get; set; }

            [Required]
            [Display(Name = "Username")]
            public string Username { get; set; }

            [Required]
            [EmailAddress]
            [Display(Name = "Email")]
            public string Email { get; set; }

            [Required]
            [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
            [DataType(DataType.Password)]
            [Display(Name = "Password")]
            public string Password { get; set; }

            [DataType(DataType.Password)]
            [Display(Name = "Confirm password")]
            [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
            public string ConfirmPassword { get; set; }

            [Display(Name = "Gender")]
            public string Gender { get; set; }

            [Required]
            [Display(Name = "Mobile Phone")]
            public string PhoneNumber { get; set; }

            //[Required]
            [Display(Name = "Birthday - yyyy/mm/dd")]
            public DateTime DateOfBirth { get; set; }

            //public DateTime PostedDate { get; set; }
        }


    Controller:
    [HttpGet, ActionName("profile")]
            public ActionResult Edit()
            {

                return  View();
            }

            [HttpPost, ActionName("profile")]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Edit(EditUserViewModel editUser)
            {
                if (ModelState.IsValid && TempData["Username"] != null)
                {
                    var user = await UserManager.FindByNameAsync(editUser.Username);

                    if (user == null)
                    {
                        return HttpNotFound(); //change error later
                    }
                    user.FirstName = editUser.FirstName;
                    user.LastName = editUser.LastName;
                    user.UserName = editUser.Email;
                    user.Email = editUser.Email;
                    user.PasswordHash = editUser.Password;


                    var userUpdated = await UserManager.UpdateAsync(user);

                    if (!userUpdated.Succeeded)
                    {
                        ModelState.AddModelError("", userUpdated.Errors.First());
                        return View();
                    }
                    return RedirectToAction("index", "pages");
                }
                ModelState.AddModelError("", "Something failed!!!");
                return View();
    }
public类EditUserViewModel
{
[关键]
公共字符串Id{get;set;}
[必需]
[显示(Name=“姓氏”)]
公共字符串名{get;set;}
[必需]
[显示(Name=“Last Name”)]
公共字符串LastName{get;set;}
[必需]
[显示(Name=“Username”)]
公共字符串用户名{get;set;}
[必需]
[电邮地址]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[必需]
[StringLength(100,ErrorMessage={0}必须至少有{2}个字符长。”,MinimumLength=8)]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
[数据类型(数据类型.密码)]
[显示(Name=“确认密码”)]
[比较(“密码”,ErrorMessage=“密码和确认密码不匹配。”)]
公共字符串ConfirmPassword{get;set;}
[显示(Name=“Gender”)]
公共字符串{get;set;}
[必需]
[显示(Name=“移动电话”)]
公共字符串PhoneNumber{get;set;}
//[必需]
[显示(Name=“生日-yyyy/mm/dd”)]
公共日期时间出生日期{get;set;}
//公共日期时间PostedDate{get;set;}
}
控制器:
[HttpGet,ActionName(“配置文件”)]
公共行动结果编辑()
{
返回视图();
}
[HttpPost,ActionName(“配置文件”)]
[ValidateAntiForgeryToken]
公共异步任务编辑(EditUserViewModel editUser)
{
if(ModelState.IsValid&&TempData[“Username”]!=null)
{
var user=await UserManager.FindByNameAsync(editUser.Username);
if(user==null)
{
返回HttpNotFound();//稍后更改错误
}
user.FirstName=editUser.FirstName;
user.LastName=editUser.LastName;
user.UserName=editUser.Email;
user.Email=editUser.Email;
user.PasswordHash=editUser.Password;
var userUpdated=await UserManager.UpdateAsync(用户);
如果(!userUpdated.successed)
{
ModelState.AddModelError(“,userUpdated.Errors.First());
返回视图();
}
返回重定向操作(“索引”、“页面”);
}
AddModelError(“,”出现故障!!!”);
返回视图();
}

您不能使用user.PasswordHash,因为它是由UserManager专门设置的。您需要生成密码重置令牌来重置uesrs密码,如下所示:

[HttpPost, ActionName("profile")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(EditUserViewModel editUser)
{
    if (ModelState.IsValid && TempData["Username"] != null)
    {
        var user = await UserManager.FindByNameAsync(TempData["Username"] as string);
        if (user == null)
        {
            return HttpNotFound(); //change error later
        }

        user.FirstName = editUser.FirstName;
        user.LastName = editUser.LastName;
        user.UserName = editUser.Email;
        user.Email = editUser.Email;

        var userUpdated = await UserManager.UpdateAsync(user);

        if (!string.IsNullOrWhiteSpace(editUser.Password))
        {
            UserManager.UserTokenProvider = new EmailTokenProvider<IdentityUser>();
            var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            var result = await UserManager.ResetPasswordAsync(user.Id, resetToken, editUser.Password);
        }

        if (!userUpdated.Succeeded)
        {
            ModelState.AddModelError("", userUpdated.Errors.First());
            return View();
        }
        return RedirectToAction("index", "pages");
    }

    ModelState.AddModelError("", "Something failed!!!");
    return View();
}
[HttpPost,ActionName(“profile”)]
[ValidateAntiForgeryToken]
公共异步任务编辑(EditUserViewModel editUser)
{
if(ModelState.IsValid&&TempData[“Username”]!=null)
{
var user=await UserManager.FindByNameAsync(TempData[“Username”]作为字符串);
if(user==null)
{
返回HttpNotFound();//稍后更改错误
}
user.FirstName=editUser.FirstName;
user.LastName=editUser.LastName;
user.UserName=editUser.Email;
user.Email=editUser.Email;
var userUpdated=await UserManager.UpdateAsync(用户);
如果(!string.IsNullOrWhiteSpace(editUser.Password))
{
UserManager.UserTokenProvider=新的EmailTokenProvider();
var resetToken=await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var result=await UserManager.ResetPasswordAsync(user.Id、resetToken、editUser.Password);
}
如果(!userUpdated.successed)
{
ModelState.AddModelError(“,userUpdated.Errors.First());
返回视图();
}
返回重定向操作(“索引”、“页面”);
}
AddModelError(“,”出现故障!!!”);
返回视图();
}

您不能使用user.PasswordHash,因为它是由UserManager专门设置的。您需要生成密码重置令牌来重置uesrs密码,如下所示:

[HttpPost, ActionName("profile")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(EditUserViewModel editUser)
{
    if (ModelState.IsValid && TempData["Username"] != null)
    {
        var user = await UserManager.FindByNameAsync(TempData["Username"] as string);
        if (user == null)
        {
            return HttpNotFound(); //change error later
        }

        user.FirstName = editUser.FirstName;
        user.LastName = editUser.LastName;
        user.UserName = editUser.Email;
        user.Email = editUser.Email;

        var userUpdated = await UserManager.UpdateAsync(user);

        if (!string.IsNullOrWhiteSpace(editUser.Password))
        {
            UserManager.UserTokenProvider = new EmailTokenProvider<IdentityUser>();
            var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            var result = await UserManager.ResetPasswordAsync(user.Id, resetToken, editUser.Password);
        }

        if (!userUpdated.Succeeded)
        {
            ModelState.AddModelError("", userUpdated.Errors.First());
            return View();
        }
        return RedirectToAction("index", "pages");
    }

    ModelState.AddModelError("", "Something failed!!!");
    return View();
}
[HttpPost,ActionName(“profile”)]
[ValidateAntiForgeryToken]
公共异步任务编辑(EditUserViewModel editUser)
{
if(ModelState.IsValid&&TempData[“Username”]!=null)
{
var user=await UserManager.FindByNameAsync(TempData[“Username”]作为字符串);
if(user==null)
{
返回HttpNotFound();//稍后更改错误
}
user.FirstName=editUser.FirstName;
user.LastName=editUser.LastName;
user.UserName=editUser.Email;
user.Email=editUser.Email;
var userUpdated=await UserManager.UpdateAsync(用户);
如果(!string.IsNullOrWhiteSpace(editUser.Password))
{
UserManager.UserTokenProvider=新的EmailTokenProvider();
var resetToken=await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var result=await UserManager.ResetPasswordAsync(user.Id、resetToken、editUser.Password);
}
如果(!userUpdated.successed)
{
ModelState.AddMode