Не получается получить Id пользователя ASP.NET Core

Разрабатываю WEB API с помощью ASP.NET Core 6. Сделал аутентификацию с помощью JWT токенов. В базе данных у меня есть три таблицы, представляющие пользователей - это: "Клиент", "Тренер", "Администратор". Так же в базе данных есть таблица "User", в которой хранятся: "Username", "Password", "Role". Все три сущности "Клиент", "Тренер", "Администратор" связаны с сущностью "User". То есть при регистрации, например, клиента, у меня создаются две записи в базе данных, это создается клиент и user, и между нами устанавливается связь. При аутентификации я нахожу юзера по паролю и имени пользователя, и заношу данные в токен. Но у меня почему то у юзера в полях Client, Coach, Administrator всегда остаются значения null, и я не могу получить айдишник например какого нибудь-клиента, который сейчас аутентифицируется. Вот пример кода с аутентификацией:

public string CreateToken(User user, int id)
{
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Role, user.Role),
        new Claim(ClaimTypes.Name, user.Username),
        new Claim(ClaimTypes.NameIdentifier, id.ToString()),
    };

    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Key"]!));

    var jwt = new JwtSecurityToken
    (
        issuer: _configuration["Jwt:Issuer"],
        audience: _configuration["Jwt:Audience"],
        claims: claims,
        signingCredentials: new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256),
        expires: DateTime.UtcNow.AddDays(7)
    );

    return new JwtSecurityTokenHandler().WriteToken(jwt);
}

public async Task<ResponseAPI<string>> Login(LoginUserDto request)
{
    var response = new ResponseAPI<string>();
    try
    {
        var user = await _userRepository.GetByNamePassword(request.Username, request.Password);
        if (user == null)
            throw new Exception("Wrong username or password");
        
        int id = 0;
        if (user.Client != null)
            id = user.Client.Id;
        else if (user.Coach != null)
            id = user.Coach.Id;
        else if (user.Administrator != null)
            id = user.Administrator.Id;

        response.Data = CreateToken(user, id);
        return response;
    }
    catch (Exception ex)
    {
        response.Data = null;
        response.Success = false;
        response.Message = ex.Message;
        return response;
    }
}

То есть id в метод CreateToken всегда передается 0. Вот так выглядят модельки User и Client:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; } = string.Empty;
    public string Password { get; set; } = string.Empty;
    public string Role { get; set; } = string.Empty;
    public Client? Client { get; set; }
    public Coach? Coach { get; set; }
    public Administrator? Administrator { get; set; }
}
public class Client
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public string Surname { get; set; } = string.Empty;
    public DateTime DateOfBirth { get; set; }
    public string PhoneNumber { get; set; } = string.Empty;
    public User User { get; set; }
    public int UserId { get; set; }
    public List<PurchasedSubscription> PurchasedSubscriptions { get; set; } = new();
}

Может я в моделях напутал что-нибудь, или же совсем не так мне нужно было делать, не знаю. Помогите пожалуйста. Реализация GetByNamePassword().

public async Task<User?> GetByNamePassword(string userName, string password)
{
    return await _context.Users.FirstOrDefaultAsync(u => u.Username == userName && u.Password == password);
}

Ответы (0 шт):