FindByNameAsync抛出空异常

时间:2019-10-22 14:05:12

标签: asp.net-core-identity

当前,我的应用程序是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;
        }

2 个答案:

答案 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传递的值可能是一个空字符串,对于该参数。将此呼叫包装为有条件的将解决此问题,从而仅在用户实际存在时才运行它。

相关问题