Я пытаюсь выполнить стандартную аутентификацию и авторизацию с помощью методов crud и слоев контроллера службы репозитория. Независимо от того, какое имя пользователя и пароль я указываю от БД, он всегда возвращает ошибку 401. Я не знаю, что еще попробовать или сделать. Я проверил каждую деталь несколько раз и не могу найти проблему.
REPOSITORY LAYER:METHOD
public async Task GetUserByUsernameAndPassword(string username, string password)
{
try
{
using var connection = new NpgsqlConnection(connectionString);
var commandText = "SELECT u.*, r.\"Name\" AS \"RoleName\" " +
"FROM \"User\" u " +
"JOIN \"Role\" r ON u.\"RoleId\" = r.\"Id\" " +
"WHERE u.\"Username\" = @username AND u.\"Password\" = @password";
using var command = new NpgsqlCommand(commandText, connection);
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);
await connection.OpenAsync();
using var reader = await command.ExecuteReaderAsync();
if (reader.HasRows)
{
await reader.ReadAsync();
var user = new User
{
Id = Guid.Parse(reader["Id"].ToString()),
Username = reader["Username"].ToString(),
Email = reader["Email"].ToString(),
Password = reader["Password"].ToString(),
Role = new Role
{
Name = reader["RoleName"].ToString() // mapiranje
}
};
return user;
}
else
{
return null;
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
SERVICE LAYER:
public async Task LoginUser(string username, string password)
{
var user = await _repository.GetUserByUsernameAndPassword(username, password);
if (user == null)
{
return null;
}
return CreateToken(user);
}
public string CreateToken(User user)
{
var issuer = _config["JwtSettings:Issuer"];
var audience = _config["JwtSettings:Audience"];
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSettings:Key"]));
var claims = new List
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Name, user.Username),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(ClaimTypes.Role, user.Role.Name)
};
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddHours(1),
Issuer = issuer,
Audience = audience,
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
CONTROLLER:
[HttpPost]
[Route("login")]
public async Task Login(Login request)
{
var token = await _service.LoginUser(request.Username, request.Password);
if (token == null)
{
return Unauthorized();
}
return Ok(new { Token = token });
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... ot-working
Авторизация и аутентификация с использованием jwt не работают ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение