Get role/s of current logged in user in ASP.NET Core MVC

You may want to consider trying to load the actual ApplicationUser object via the FindByEmail() or some other method and passing that object into the GetRolesAsync() method as seen below :

// Resolve the user via their email
var user = await _userManager.FindByEmailAsync(model.Email);
// Get the roles for the user
var roles = await _userManager.GetRolesAsync(user);

A more complete example might look like :

[HttpPost("Auth/SignIn")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SignIn(SignInViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, true, false);
        if (result.Succeeded)
        {
            // Resolve the user via their email
            var user = await _userManager.FindByEmailAsync(model.Email);
            // Get the roles for the user
            var roles = await _userManager.GetRolesAsync(user);

            // Do something with the roles here
        }
        else
        {
            // Uh oh....
        }
    }

    // Something is probably wrong, provide the form again....
    return View(model);
}

Short but useful:

[Route("api/[controller]")]
[ApiController]
public class RoleController : ControllerBase
{
    private readonly UserManager<User> userManager;

    public RoleController(
        UserManager<User> userManager
        )
    {
        this.userManager = userManager;
    }

    // GET api/role
    [HttpGet]
    [Authorize]
    public async Task<IEnumerable<string>> Get()
    {
        var userId = User.FindFirstValue(ClaimTypes.Name);
        var user = await userManager.FindByIdAsync(userId);
        var role = await userManager.GetRolesAsync(user);
        return role;
    }
}

Hopes it helps.