为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Identity UserManager UpdateAsync 删除角色

ASP.NET Identity UserManager UpdateAsync 删除角色

C#
30秒到达战场 2021-11-28 19:56:22
我们的应用程序中有一个屏幕,允许管理员角色的成员编辑用户帐户详细信息。最终,任何用户对象都会发送到服务器并使用以下方法进行更新:await userManager.UpdateAsync(user);这在更新用户记录时按预期工作。我们可以进行持久化到数据库的更改,例如用户名、电话号码等。我看到的问题是,有时更新角色而不是向用户添加其他角色时,它会删除所有角色。在我们的ApplicationUser对象上,我们有一个这样的属性:public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();因此,我们可以将客户端和服务器之间的角色作为用户对象的一部分进行反弹。我正在努力理解的是userManager.UpdateAsync(user);我所看到的方法的不一致行为。它显然有效,否则永远无法向用户添加任何角色。每次提交时,到达服务器的对象都会正确填充角色。基本流程是:添加角色并提交角色正确添加到用户添加其他角色并提交删除所有角色如何防止它删除角色?谢谢!
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-11-28
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

尝试下面的代码来添加新角色


private readonly ApplicationDbContext _context;

    private readonly UserManager<ApplicationUser> _userManager;

    private readonly RoleManager<IdentityRole> _roleManager;

    public HomeController(ApplicationDbContext context

        , UserManager<ApplicationUser> userManager

        , RoleManager<IdentityRole> roleManager)

    {

        _context = context;

        _userManager = userManager;

        _roleManager = roleManager;

    }

    public async Task<IActionResult> CreateUserAndRole()

    {

        await _userManager.CreateAsync(new ApplicationUser { UserName = "test@outlook.com", Email = "test@outlook.com" });

        await _roleManager.CreateAsync(new IdentityRole {  Name = "Admin" });

        await _roleManager.CreateAsync(new IdentityRole { Name = "Administrator" });

        return Ok();

    }

    public async Task<IActionResult> AddAdminRoleToUser()

    {

        ApplicationUser user = _context.Users.FirstOrDefault(u => u.UserName == "test@outlook.com");

        var role = await _roleManager.FindByNameAsync("Admin");

        user.Roles.Add(new IdentityUserRole<string> { RoleId = role.Id, UserId = user.Id });

        await _userManager.UpdateAsync(user);

        return Ok();

    }

    public async Task<IActionResult> AddAdministratorRoleToUser()

    {

        ApplicationUser user = _context.Users.FirstOrDefault(u => u.UserName == "test@outlook.com");

        var role = await _roleManager.FindByNameAsync("Administrator");

        user.Roles.Add(new IdentityUserRole<string> { RoleId = role.Id, UserId = user.Id });

        await _userManager.UpdateAsync(user);

        return Ok();

    }


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 248 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信