FindByNameAsync抛出空异常

问题描述 投票:0回答:2

目前,我的应用程序是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;
        }
asp.net-core-identity
2个回答
0
投票

您应该等待异步调用以获取结果:

var response = await _userManager.FindByNameAsync(userName);

此外,您将需要用async装饰GetUserName函数


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传递的值可能是一个空字符串,对于该参数而言不是有效值。将此呼叫包装为有条件的将解决此问题,从而仅在用户实际存在时才运行它。
© www.soinside.com 2019 - 2024. All rights reserved.