“用户安全标记不能为空。”在 ASP.NET Core Identity 中添加/删除用户角色时出错

问题描述 投票:0回答:1

如果用户的角色与已有的角色不匹配,我尝试向用户添加角色,并删除匹配的角色,但出现以下错误:

用户安全标记不能为空。

控制器:

[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);
}
asp.net-core asp.net-core-mvc asp.net-core-identity
1个回答
4
投票

您正在使用通过

POST
获得的用户,这不仅是不好的做法,而且甚至在这里不起作用,因为您没有发布完整的
User
对象。也就是说,缺少
SecurityStamp
的值,这就是异常告诉您的内容。

请勿发布

User
。相反,请使用
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")
    // use "user", not "model" for role management functions
    user.FirstName = model.FirstName;

    // the rest of your code
}
© www.soinside.com 2019 - 2024. All rights reserved.