Я перенес веб-API ASP.NET Core 2.2 в .NET 8.0, скопировав код в пустой проект .NET 8.0, и в основном устранил все ошибки сборки, установив необходимые зависимости и т. д. Я получил веб-API для запуск, но попытка войти в интерфейс, подключенный к веб-API, похоже, не работает. Я только что получаю сообщение об ошибке 500 ошибок ответа HTTP.
Я перевел веб-API в режим отладки в VS2022 и пошел шаг за шагом, чтобы увидеть, что происходит не так, и я обнаружил, что сначала из-за При миграции хешированные пароли устарели, поэтому вместо получения PasswordVerificationResult.Success я получал PasswordVerificationResult.SuccessRehashNeeded, и, таким образом, для возвращаемого пользователя было установлено значение null. Я пока не хотел рисковать возиться с базой данных, поэтому временно изменил проверку на PasswordVerificationResult.SuccessRehashNeeded. И логика проверки работает, и кажется, что она движется к действию входа в систему, но затем, после прохождения первоначальной проверки учетных данных, отладка, похоже, переходит к длинной последовательности непонятных для меня шагов.
Это включает в себя переход к различным файлам, таким как Task.cs, ExecutionContext.cs, AsyncTaskMethodBuilderT.cs, TaskAwaiter.cs и т. д. Все это в конечном итоге заканчивается возвратом ошибки 500. Я новичок в .NET и не создавал этот веб-API, поэтому надеюсь получить здесь помощь.
AccountController.cs:
[AllowAnonymous]
[Route("~/api/Token")]
public async Task Token([FromBody] UserModel userParam)
{
UserModel user = await _userService.AuthenticateAsync(userParam.Username, userParam.Password);
if (user == null)
{
return BadRequest(new { message = "Username or password is incorrect" });
}
else if (user.Id != 0)
{
return BadRequest(new { message = "Account is inactive or is expired" });
}
else
{
SessionHistoryModel sessionHist = new SessionHistoryModel();
sessionHist.Action = "Login";
sessionHist.HistTimeStamp = DateTime.Now;
sessionHist.UserId = _sqlProvider.GetUserId(user.Username.ToString());
sessionHist.UserName = user.Username;
sessionHist.Token = user.Token;
int sessionHistStatus = _sqlProvider.SaveConfigurationInstances(sessionHist, "SessionHist");
}
return Ok(user);
}
После завершения выполнения этой части начинается вышеупомянутая серия непонятных шагов.
AuthenthicateAsync():
public async Task AuthenticateAsync(string username, string password)
{
UserModel userModel = new UserModel();
//ApplicationUser user;
var user = await _userManager.FindByNameAsync(username);
// return null if user not found
var check = _userManager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, password);
if (user == null || !check.Equals(PasswordVerificationResult.SuccessRehashNeeded))
{
return null;
}
else if (user.IsActive == false || user.AccountExpiryDate < DateTime.Now)
{
userModel.Id = user.Id;
return userModel;
}
// authentication successful so generate jwt token
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
var claims = new List
{
new Claim(ClaimTypes.Name, user.Id.ToString())
};
// Get User roles and add them to claims
var roles = await _userManager.GetRolesAsync(user);
AddRolesToClaims(claims, roles);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
userModel.Username = username;
userModel.Token = tokenHandler.WriteToken(token);
// remove password before returning
userModel.Password = null;
return userModel;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... nger-works