正在调用UserManager.AddToRole擦除用户密码



我是MVC5/ASP的新手。NET Identity和我发现了一个困扰我的问题。

我正在为我的ASP写一个小表单。NET MVC5应用程序,该应用程序将允许管理员用户(管理员角色的成员(查看已注册到该网站的用户,并编辑这些用户的详细信息并为这些用户分配角色。提交表单时,如果已将角色分配给用户UserManager。调用了AddToRole方法。

之后我注意到,一旦完成,该用户就无法登录到应用程序。在数据库中查看,当调用AddToRole时,PasswordHash字段会显示为null。这正常吗?如果不正常,我该如何解决这个问题?

作为参考,我的相关代码在下方

控制器

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public ActionResult Details(EditUserViewModel model)
{
    model.Save();
    return RedirectToAction("List", "Account");
}

相关视图模型

public class EditUserViewModel
{
    public string UserId { get; set; }
    public string UserName { get; set; }
    [Required]
    [StringLength(255)]
    [Display(Name = "Email address")]
    public string Email { get; set; }
    [StringLength(255)]
    [Display(Name = "First name")]
    public string FirstName { get; set; }
    [StringLength(255)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
    [StringLength(255)]
    [Display(Name = "Mobile Number")]
    public string MobileNumber { get; set; }
    public IList<EditUserRolesViewModel> UserRoles { get; set; }
    public void Save()
    {
        using (ApplicationDbContext context = new ApplicationDbContext())
        {
            ApplicationUser user = new ApplicationUser()
            {
                Id = this.UserId,
                UserName = this.UserName,
                Email = this.Email,
                FirstName = this.FirstName,
                LastName = this.LastName,
                MobileNumber = this.MobileNumber
            };
            context.Users.Attach(user);
            context.Entry(user).Property(x => x.Email).IsModified = true;
            context.Entry(user).Property(x => x.FirstName).IsModified = true;
            context.Entry(user).Property(x => x.LastName).IsModified = true;
            context.Entry(user).Property(x => x.MobileNumber).IsModified = true;
            context.SaveChanges();
            var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
            foreach (var row in this.UserRoles)
            {
                if (row.RowChanged)
                {
                    if (row.RoleAssigned)
                    {
                        UserManager.AddToRole(this.UserId, row.RoleName);
                    }
                    else
                    {
                        UserManager.RemoveFromRole(this.UserId, row.RoleName);
                    }
                }
            }
        }
    }
}
public class EditUserRolesViewModel
{
    public string RoleId { get; set; }
    [Display(Name = "Role name")]
    public string RoleName { get; set; }
    [Display(Name = "Assigned")]
    public bool RoleAssigned { get; set; }
    public bool RowChanged { get; set; }
}

正如我从您的代码中看到的,您已经将部分初始化的对象user附加到context.Users。因此,当UserManager获得控制:AddToRole时,它会尝试更新数据库。在当前用户行中会有很多空字段或null字段。

您可以修复以下任何操作(两者都有帮助(:

  1. 而不是
    ApplicationUser user = new ApplicationUser()
    使用
    user = UserManager.FindById(UserId)
    在从视图模型分配值之后,EntityFramework将处理修改后的字段。

  2. 处理角色时使用其他上下文
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

相关内容

  • 没有找到相关文章

最新更新