Во-первых, не блокируйте асинхронные задачи. Вы находитесь в асинхронном методе, поэтому нет никаких оснований не ожидать результата:
private async Task<string> GetUserNameAsync(string userName)
{
var response = await _userManager.FindByNameAsync(userName);
return response?.UserName ?? string.Empty;
}
Тогда:
var userName = await GetUserNameAsync(user);
Во-вторых, это не имеет никакого смысла в любом случае,как у вас уже есть имя пользователя. Вам просто нужно знать, существует ли он еще или нет. Таким образом, у вас действительно должно быть что-то вроде?
public async Task<bool> UserNameExistsAsync(string userName)
{
return await _userManager.FindByNameAsync(userName) != null;
}
Тогда:
if (await UserNameExistsAsync(user))
{
// do something
}
И, собственно, было бы лучше , чтобы использовать контекст прямо здесь, но для этого может потребоваться дополнительная зависимость:
var userNameExists = await _context.Users.AnyAsync(x => x.UserName == user);
Независимо от этого источник вашей проблемы заключается в том, что когда приходит время вызвать PasswordSignInAsync
, значение, которое вы передаете для userName
, может бытьпустая строка, которая не является допустимым значением для этого параметра. Заключение этого вызова в условное выражение решило бы проблему, так что вы выполняете его, только если пользователь действительно существует.