Не получается получить 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);
}