You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core Razor中实现邮箱/手机号字段登录?

实现ASP.NET Core Razor Page多方式登录(手机号/邮箱/用户名)

要绕过PasswordSignInAsync仅支持用户名登录的限制,核心思路是先根据输入的登录标识(手机号/邮箱/用户名)找到对应用户,再手动验证密码并执行登录,具体实现步骤如下:

  1. 调整登录输入模型
    把原有的Username字段改为更通用的LoginId,用于接收手机号、邮箱或用户名:
public class InputModel
{
    [Required]
    [Display(Name = "手机号/邮箱/用户名")]
    public string LoginId { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "记住我?")]
    public bool RememberMe { get; set; }
}
  1. 替换登录逻辑代码
    在登录页面的OnPostAsync方法中,替换原有的PasswordSignInAsync调用,改为手动查询用户、验证密码并完成登录:
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl ??= Url.Content("~/");

    if (ModelState.IsValid)
    {
        // 按优先级查找用户:先查邮箱,再查手机号,最后查用户名
        var user = await _userManager.FindByEmailAsync(Input.LoginId);
        if (user == null)
        {
            user = await _userManager.FindByPhoneNumberAsync(Input.LoginId);
        }
        if (user == null)
        {
            user = await _userManager.FindByNameAsync(Input.LoginId);
        }

        if (user == null)
        {
            ModelState.AddModelError(string.Empty, "无效的登录信息");
            return Page();
        }

        // 验证密码正确性
        var passwordValid = await _userManager.CheckPasswordAsync(user, Input.Password);
        if (!passwordValid)
        {
            ModelState.AddModelError(string.Empty, "无效的登录信息");
            return Page();
        }

        // 可选:处理账户锁定逻辑
        if (await _userManager.IsLockedOutAsync(user))
        {
            ModelState.AddModelError(string.Empty, "账户已锁定,请稍后再试");
            return Page();
        }

        // 执行登录操作
        await _signInManager.SignInAsync(user, Input.RememberMe);
        return LocalRedirect(returnUrl);
    }

    // 模型验证失败,返回登录页面
    return Page();
}
  1. 额外说明
  • 确保你的IdentityUser派生类包含PhoneNumber字段(默认Identity模板已自带,自定义用户类需确认)。
  • 出于安全考虑,统一返回"无效的登录信息"可以避免泄露用户账户的存在性,若需区分具体错误类型,可在查询阶段单独处理提示。
  • 若需要密码错误锁定功能,可在密码验证失败时调用_userManager.AccessFailedAsync(user),配合锁定判断逻辑使用。

内容的提问来源于stack exchange,提问作者Jesica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:18:32