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

如何在ASP.NET Core 6.0中实现用户名或邮箱登录

实现ASP.NET Core 6.0 Identity用户名/邮箱独立登录

1. 确认用户模型配置

默认的IdentityUser已经包含独立的UserName和Email属性,只需在配置中确保邮箱唯一性,同时按需调整用户名允许的字符范围:

builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

// 配置用户验证规则
builder.Services.Configure<IdentityOptions>(options =>
{
    options.User.RequireUniqueEmail = true; // 强制邮箱唯一
    options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"; // 可根据需求修改
});

2. 自定义登录验证逻辑

修改登录页面的后台处理方法,让系统优先尝试用输入内容匹配邮箱,匹配失败再尝试匹配用户名,之后验证密码:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl ??= Url.Content("~/");

    if (ModelState.IsValid)
    {
        // 先按邮箱查找用户
        var user = await _userManager.FindByEmailAsync(Input.UserName);
        if (user == null)
        {
            // 邮箱没找到,再按用户名查找
            user = await _userManager.FindByNameAsync(Input.UserName);
        }

        if (user != null)
        {
            // 验证密码并执行登录
            var result = await _signInManager.PasswordSignInAsync(user, Input.Password, Input.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                _logger.LogInformation("User logged in.");
                return LocalRedirect(returnUrl);
            }
            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, "登录失败,请检查账号密码。");
                return Page();
            }
        }
        else
        {
            ModelState.AddModelError(string.Empty, "登录失败,请检查账号密码。");
            return Page();
        }
    }

    // 模型验证失败,返回登录页
    return Page();
}

3. 完善注册页面处理

确保注册时正确给UserName和Email字段赋值,后台代码示例:

var user = new ApplicationUser 
{ 
    UserName = Input.UserName, 
    Email = Input.Email
};

var result = await _userManager.CreateAsync(user, Input.Password);

前端表单添加对应的输入框(示例):

<div class="form-floating mb-3">
    <input asp-for="Input.UserName" class="form-control" autocomplete="username" aria-required="true" />
    <label asp-for="Input.UserName">用户名</label>
    <span asp-validation-for="Input.UserName" class="text-danger"></span>
</div>
<div class="form-floating mb-3">
    <input asp-for="Input.Email" class="form-control" autocomplete="email" aria-required="true" />
    <label asp-for="Input.Email">邮箱</label>
    <span asp-validation-for="Input.Email" class="text-danger"></span>
</div>

4. 可选:调整登录页面提示

修改登录输入框的提示文字,明确告知用户可使用用户名或邮箱登录:

<div class="form-floating">
    <input asp-for="Input.UserName" class="form-control" autocomplete="username" aria-required="true" />
    <label asp-for="Input.UserName">用户名或邮箱</label>
    <span asp-validation-for="Input.UserName" class="text-danger"></span>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:28:22