如果在ASP.NET Core MVC中找不到用户,则使用电子邮件或用户名登录的用户将为空

袋鼠

我使用的默认身份页面经过了一些修改,在登录页面中,我包括了用于登录的用户名。它运行良好,用户现在可以通过电子邮件和用户名登录,但是当用户输入错误信息时,将显示空异常,而不是显示

无效的登录尝试

码:

if (ModelState.IsValid)
{
    //Check if user entered email or username in the Input.Email property
    var user = await _userManager.FindByNameAsync(Input.Email) ?? await _userManager.FindByEmailAsync(Input.Email);
    // user is null if not exist? error

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, set lockoutOnFailure: true
    var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: true);

    if (result.Succeeded)
    {
        //some code
    }
    if (result.RequiresTwoFactor)
    {
        return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
    }
    if (result.IsLockedOut)
    {
        _logger.LogWarning("User account locked out.");
        return RedirectToPage("./Lockout");
    }
    else
    {
        ModelState.AddModelError(string.Empty, "Invalid login attempt.");
        return Page();
    }
}

我知道为什么会发生错误,但不知道解决该错误的正确方法。

本来是signInManager检查用户输入而不是实际用户,所以如果找不到输入,则不会成功,我该如何使用相同的旧方法?

Fei Han

当用户输入错误信息时,将出现空异常

PasswordSignInAsync(TUser, String, Boolean, Boolean)method的源代码中,我们发现,如果user为null,它将抛出NullException错误。

public virtual async Task<SignInResult> PasswordSignInAsync(TUser user, string password,
            bool isPersistent, bool lockoutOnFailure)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            var attempt = await CheckPasswordSignInAsync(user, password, lockoutOnFailure);
            return attempt.Succeeded
                ? await SignInOrTwoFactorAsync(user, isPersistent)
                : attempt;
        }

我该如何用旧的方式做?

您可以如下修改代码以检查user是否为空,并设置并显示“无效的登录尝试”。错误信息。

var user = await _userManager.FindByNameAsync(Input.Email) ?? await _userManager.FindByEmailAsync(Input.Email);

if (user == null)
{
    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
    return Page();
}

var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: true);

//...
//code logic here

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在ASP.NET Core中支持使用电子邮件或用户名登录同一用户

ASP.NET Core:如何使用“用户名”而不是“电子邮件”登录?

如果在Asp.Net Core身份中用户登录连续失败,如何禁用帐户

ASP.NET Identity 2电子邮件和用户名的分隔,并使用电子邮件登录

如果在ASP.Net中绕过了Statement

我可以从电子邮件地址而不是 ASP.NET Core 和 DirectoryServices 中的用户名获取用户身份吗?

如果在Asp.Net Core中指定了多个策略(例如,中间件配置,控制器/操作属性),则使用哪种授权策略?

ASP.NET Identity 注册新用户以使用用户名作为用户名而不是电子邮件,但仍不显示登录者

在Asp.net mvc5中使用用户名代替电子邮件作为身份

如何在ASP.Net Web窗体身份中使用“用户名”而不是“电子邮件地址”登录

如果在ASP.NET中关闭窗口但不在PostBack上则显示消息

如果在 asp.net 中克里特岛评估

如何通过接口获取当前登录的用户名,以在asp.net core mvc中按列插入更新?

如果在NET Core库中添加PackageReference net46,会发生什么情况?

如果在虚拟目录中发布,Asp.Net Core signalR将不起作用

ASP Net Core获取用户Windows用户名

如何将ASP.NET MVC默认登录页面更改为通过用户名而不是电子邮件地址登录?

使用 httpContext asp.net core mvc 将用户名传递到标头中

如果在MVC Core 3.1中使用asp-for属性,则在POST之后未设置该值

如何使用ASP.NET Core从DbContext中的JWT获取用户名?

如何使用用户名和密码访问 Asp.Net Core 中的 MongoDb?

如果在Asp.Net MVC中有条件,是否可以检查内部的TempData?

如果在ASP.Net中的GridView ItemTemplate中选中了一个CheckBox,则禁用其他CheckBoxes。

如果在Asp.net中使用“更新面板”,是否应该点击Page_Load方法

如何在 ASP.NET Core Identity 中控制器的构造函数中获取登录用户名

ASP.NET核心身份更改用户名/电子邮件

在ASP.NET Identity中将电子邮件设置为用户名

修剪用户名 ASP.NET 的电子邮件部分

防止没有确认电子邮件的用户使用身份2登录ASP.Net MVC