ASP.NET 核心添加和删除角色

ASP.NET CORE Adding and Removing Roles

正如标题所说,如果角色与用户拥有的角色不匹配,我正在尝试从我获得的数组中添加角色。那些确实匹配的我想被删除。这是我的控制器逻辑。 string id 是我得到的角色的名字。 另外,当我 运行 这段代码时,我得到一个异常提示 "用户安全戳不能为空。"

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User user, string[] roles)
{
    if (id != user.Id)
    {
        return NotFound();
    }

    if (ModelState.IsValid)
    {
        try
        {
            var listOfRoles = await privateUser.GetRolesAsync(user);

            foreach (var role in listOfRoles.Except(roles))
            {
                await privateUser.RemoveFromRoleAsync(user, role);
            }

            foreach(var role in roles.Except(listOfRoles))
            {
                await privateUser.AddToRoleAsync(user, role);
            }

            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!UserExists(user.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }
    return View(user);
}

您正在使用通过 POST 获得的用户,这不仅是不好的做法,而且甚至不会在这里工作,因为您没有 post 完整的 User 对象。即,缺少 SecurityStamp 的值,这是异常告诉您的内容。

不要post User。相反,使用用户 ID 从数据库中获取它:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, string[] roles)
{
    var user = await _userManager.FindByIdAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    // the rest of your code

UPDATE(同时修改用户)

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User model, string[] roles)
{
    var user = await _userManager.FindByIdAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    // map over the values from `model` (i.e. the posted `User`)
    user.FirstName = model.FirstName;
    // etc.

    // use `user` not `model` for role management functions