Pré-requisitos

Estrutura do token de acesso

Quando o middleware UseAuthentication valida o JWT, ele preenche o HttpContext.User com todas as claims do token.
JWT decodificado (exemplo)
{
  "sub": "abc123",
  "email": "joao@empresa.com",
  "name": "João Silva",
  "Clientes": ["clientes:view", "clientes:edit"],
  "Projetos": ["projetos:view", "projetos:edit"]
}

Como acessar os dados de um usuário

Você pode acessar os dados do usuário autenticado diretamente pelo User.Claims, que é preenchido automaticamente pelo middleware UseAuthentication ao validar o JWT. No exemplo abaixo, consultamos o e-mail, o ID (sub) e o nome do usuário:
UserController.cs
[HttpGet("me")]
    {
        // Consulta o email do usuário logado
        var email = User.Claims
            .FirstOrDefault(c => c.Type == "email")?.Value;

        // Consulta o ID (subject) do usuário
        var userId = User.Claims
            .FirstOrDefault(c => c.Type == "sub")?.Value;

        // Consulta o nome
        var name = User.Claims
            .FirstOrDefault(c => c.Type == "name")?.Value;

        return Ok(new
        {
            Id = userId,
            Email = email,
            Name = name
        });
    }

Verificar se o usuário possui uma permissão específica

Para atender uma regra de negócio específica, você pode checar uma claim diretamente no código. Para regras mais gerais como visualizar, editar ou deletar recomenda-se criar um filtro de permissões.
CustomerController.cs
[HttpGet("{id}/confidential")]
public async Task<IActionResult> GetConfidentialData(long id)
{
    // Verifica se o usuário tem a claim de ler dados confidenciais em Clientes
    var canEdit = User.Claims
        .Any(c => c.Type == "Clientes" && c.Value.Contains(":confidential"));

    if (!canEdit)
    {
        return Forbid(); // Retorna 403
    }

    return Ok(await _service.GetConfidentialData(id));
}