如何从 AspnetRoleUsers 中删除包括角色和用户在内的用户

how to delete users including roles and users from AspnetRoleUsers

我正在使用 asp.net core 3.1 创建一个项目,但我找不到使用 Web.api

删除 Asp.net core 3.1 中包括角色的用户的正确来源

这是我试过但似乎不合适但还没有尝试过的代码。您对如何实现这一点有任何想法吗? 我想使用 Web Api 函数(例如状态代码)或发送到前端的任何错误消息来适当地检查错误。

[HttpPost, ActionName("Delete")]
public async Task<ActionResult> DeleteUser(string id)
{


    var user = await _userManager.FindByIdAsync(id);
    var rolesForUser = await _userManager.GetRolesAsync(user); 
    if (rolesForUser.Count() > 0)
    {
        foreach (var item in rolesForUser.ToList())
        {
            // item should be the name of the role
            var result = await _userManager.RemoveFromRoleAsync(user, item);
        }
    }

    await _userManager.DeleteAsync(user);  
    return OkResult(result);
}


你不需要循环删除角色,你可以使用RemoveFromRolesAsync :

public virtual Task<IdentityResult> RemoveFromRolesAsync(TUser user, IEnumerable<string> roles);

并且每次操作都会return IdentityResult 可以用来查看操作状态:

if (User.Identity.IsAuthenticated)
{
    try
    {
        var user = await _userManager.FindByIdAsync(id);
        var roles= await _userManager.GetRolesAsync(user);  

        var result =  await _userManager.RemoveFromRolesAsync(user, roles);
        if (result.Succeeded)
        {
            var resultdelete = await _userManager.DeleteAsync(user);
            if (result.Succeeded)
            {
                return Ok();
            }
            else
            {
                List<string> errors = new List<string>();
                foreach (var error in result.Errors)
                {
                    errors.Add(error.Description);
                }
                return BadRequest(errors);

            }
        }
        else
        {
            List<string> errors = new List<string>();
            foreach (var error in result.Errors)
            {
                errors.Add(error.Description);
            }
            return BadRequest(errors);
        }
    }
    catch (Exception exception)
    {
        List<string> errors = new List<string>() { exception.Message };
        return StatusCode(StatusCodes.Status500InternalServerError, errors);
    }
}

但是使用带有事务的数据库存储过程总是一个不错的选择。