ASP.NET CORE添加和删除角色

时间:2019-03-11 15:51:26

标签: model-view-controller asp.net-core-mvc asp.net-core-identity

正如标题所述,如果角色与用户所拥有的角色不匹配,我将尝试从获得的数组中添加角色。那些与我匹配的人要删除。这是我的控制器逻辑。 字符串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);
}

1 个答案:

答案 0 :(得分:1)

您正在使用通过POST获得的用户,这不仅是不习惯的做法,而且甚至在这里也不起作用,因为您没有发布完整的User对象。即,SecurityStamp的值丢失了,这就是异常告诉您的内容。

请勿发布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

更新(用于同时修改用户)

[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