ASP.NET CORE Добавление и удаление ролей - PullRequest
2 голосов
/ 11 марта 2019

Как видно из заголовка, я пытаюсь добавить роли из массива, который я получаю, если роли не совпадают с теми, которые есть у пользователя.Те, которые соответствуют, я хочу быть удаленным.вот моя логика контроллера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);
}

1 Ответ

1 голос
/ 11 марта 2019

Вы используете пользователя, полученного с помощью POST, что является не только плохой практикой, но даже не работает здесь, потому что вы не публикуете полный объект User.А именно, значение SecurityStamp отсутствует, о чем говорит вам исключение.

Не публикуйте User.Вместо этого используйте идентификатор пользователя для извлечения его из базы данных:

[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
...