如何在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
相关产品推荐
相关产品推荐

