ASP.NET Identity UserManager UpdateAsync 删除角色

我们的应用程序中有一个屏幕,允许管理员角色的成员编辑用户帐户详细信息。

最终,任何用户对象都会发送到服务器并使用以下方法进行更新:

await userManager.UpdateAsync(user);

这在更新用户记录时按预期工作。我们可以进行持久化到数据库的更改,例如用户名、电话号码等。

我看到的问题是,有时更新角色而不是向用户添加其他角色时,它会删除所有角色。

在我们的ApplicationUser对象上,我们有一个这样的属性:

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();

因此,我们可以将客户端和服务器之间的角色作为用户对象的一部分进行反弹。

我正在努力理解的是userManager.UpdateAsync(user);我所看到的方法的不一致行为。它显然有效,否则永远无法向用户添加任何角色。

每次提交时,到达服务器的对象都会正确填充角色。基本流程是:

  1. 添加角色并提交

  2. 角色正确添加到用户

  3. 添加其他角色并提交

  4. 删除所有角色

如何防止它删除角色?

谢谢!


30秒到达战场
浏览 249回答 2
2回答

ITMISS

当您调用时,await userManager.UpdateAsync(user);您正在更新用户模型及其所有相关数据。您需要将新角色添加到现有角色列表中,而不是创建新的空列表并添加新记录。

慕哥6287543

尝试下面的代码来添加新角色private readonly ApplicationDbContext _context;&nbsp; &nbsp; private readonly UserManager<ApplicationUser> _userManager;&nbsp; &nbsp; private readonly RoleManager<IdentityRole> _roleManager;&nbsp; &nbsp; public HomeController(ApplicationDbContext context&nbsp; &nbsp; &nbsp; &nbsp; , UserManager<ApplicationUser> userManager&nbsp; &nbsp; &nbsp; &nbsp; , RoleManager<IdentityRole> roleManager)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _context = context;&nbsp; &nbsp; &nbsp; &nbsp; _userManager = userManager;&nbsp; &nbsp; &nbsp; &nbsp; _roleManager = roleManager;&nbsp; &nbsp; }&nbsp; &nbsp; public async Task<IActionResult> CreateUserAndRole()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await _userManager.CreateAsync(new ApplicationUser { UserName = "test@outlook.com", Email = "test@outlook.com" });&nbsp; &nbsp; &nbsp; &nbsp; await _roleManager.CreateAsync(new IdentityRole {&nbsp; Name = "Admin" });&nbsp; &nbsp; &nbsp; &nbsp; await _roleManager.CreateAsync(new IdentityRole { Name = "Administrator" });&nbsp; &nbsp; &nbsp; &nbsp; return Ok();&nbsp; &nbsp; }&nbsp; &nbsp; public async Task<IActionResult> AddAdminRoleToUser()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ApplicationUser user = _context.Users.FirstOrDefault(u => u.UserName == "test@outlook.com");&nbsp; &nbsp; &nbsp; &nbsp; var role = await _roleManager.FindByNameAsync("Admin");&nbsp; &nbsp; &nbsp; &nbsp; user.Roles.Add(new IdentityUserRole<string> { RoleId = role.Id, UserId = user.Id });&nbsp; &nbsp; &nbsp; &nbsp; await _userManager.UpdateAsync(user);&nbsp; &nbsp; &nbsp; &nbsp; return Ok();&nbsp; &nbsp; }&nbsp; &nbsp; public async Task<IActionResult> AddAdministratorRoleToUser()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ApplicationUser user = _context.Users.FirstOrDefault(u => u.UserName == "test@outlook.com");&nbsp; &nbsp; &nbsp; &nbsp; var role = await _roleManager.FindByNameAsync("Administrator");&nbsp; &nbsp; &nbsp; &nbsp; user.Roles.Add(new IdentityUserRole<string> { RoleId = role.Id, UserId = user.Id });&nbsp; &nbsp; &nbsp; &nbsp; await _userManager.UpdateAsync(user);&nbsp; &nbsp; &nbsp; &nbsp; return Ok();&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP