当前,我的应用程序是asp.net核心应用程序,它通过userEmail验证用户,现在需要更改以通过userName验证它。 我已将方法从FindByEmailAsync更改为FindByNameAsync。如果我输入了电子邮件地址,但我使用的是 n userName无效。它为response.Result.UserName引发null异常。 有人可以告诉我问题出在哪里吗
public async Task<SignInResult> PasswordSignInAsync(string user, string password, bool isPersistent, bool lockoutOnFailure)
{
var userName = GetUserName(user);
return await _signInManager.PasswordSignInAsync(userName, password, isPersistent, lockoutOnFailure);
}
private string GetUserName(string userName)
{
//if (!userNameOrEmail.Contains("@"))
// return userNameOrEmail;
var response = _userManager.FindByNameAsync(userName);
return response.Result != null ? response.Result.UserName : string.Empty;
}
答案 0 :(得分:0)
您应该等待异步调用以获取结果:
async
此外,您将需要用{{1}}修饰GetUserName函数
答案 1 :(得分:0)
首先,不要阻止异步任务。您处于异步方法中,因此没有理由不真正等待结果:
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
传递的值可能是一个空字符串,对于该参数。将此呼叫包装为有条件的将解决此问题,从而仅在用户实际存在时才运行它。