登录成功跳转MyAccounts控制器报404错误求助
问题描述
登录成功且邮箱已确认后,期望跳转至MyAccounts/Index页面,但实际被重定向到https://localhost:7050/Account/Login?ReturnUrl=%2FMyAccounts并触发404错误。
控制器代码
Login Controller
using EasyCashIdentityProject.EntityLayer.Concrete; using EasyCashIdentityProject.PresentationLayer.Models; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace EasyCashIdentityProject.PresentationLayer.Controllers { public class LoginController : Controller { private readonly SignInManager<AppUser> _signInManager; private readonly UserManager<AppUser> _userManager; public LoginController(SignInManager<AppUser> signInManager, UserManager<AppUser> userManager) { _signInManager = signInManager; _userManager = userManager; } [HttpGet] public IActionResult Index() { return View(); } [HttpPost] public async Task<IActionResult> Index(LoginViewModel loginViewModel) { var result = await _signInManager.PasswordSignInAsync(loginViewModel.Username, loginViewModel.Password, false, true); if (result.Succeeded) { var user = await _userManager.FindByNameAsync(loginViewModel.Username); if (user.EmailConfirmed == true) { return RedirectToAction("Index", "MyAccounts"); } } return View(); } } }
MyAccounts Controller
using EasyCashIdentityProject.DtoLayer.Dtos.AppUserDtos; using EasyCashIdentityProject.EntityLayer.Concrete; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace EasyCashIdentityProject.PresentationLayer.Controllers { [Authorize] public class MyAccountsController : Controller { private readonly UserManager<AppUser> _userManager; public MyAccountsController(UserManager<AppUser> userManager) { _userManager = userManager; } [HttpGet] public async Task<IActionResult> Index() { var values = await _userManager.FindByNameAsync(User.Identity.Name); AppUserEditDto appUserEditDto = new AppUserEditDto(); appUserEditDto.Name= values.Name; appUserEditDto.Surname= values.Surname; appUserEditDto.PhoneNumber= values.PhoneNumber; appUserEditDto.Email= values.Email; appUserEditDto.City = values.City; appUserEditDto.District = values.District; appUserEditDto.ImageUrl = values.ImageUrl; return View(appUserEditDto); } [HttpPost] public async Task<IActionResult> Index(AppUserEditDto appUserEditDto) { if(appUserEditDto.Password==appUserEditDto.ConfirmPassword) { var user = await _userManager.FindByNameAsync(User.Identity.Name); user.PhoneNumber = appUserEditDto.PhoneNumber; user.Surname = appUserEditDto.Surname; user.City = appUserEditDto.City; user.District = appUserEditDto.District; user.ImageUrl = "test"; user.Email = appUserEditDto.Email; user.PasswordHash = _userManager.PasswordHasher.HashPassword(user, appUserEditDto.Password); var result = await _userManager.UpdateAsync(user); if(result.Succeeded) { return RedirectToAction("Index", "Login"); } } return View(); } } }
问题排查与解决方案
1. 核心原因:Identity默认登录路径未配置
ASP.NET Identity默认的登录跳转路径是/Account/Login,但你的项目中使用的是自定义的LoginController,导致授权失败时(或身份验证状态识别异常时),系统找不到默认路径对应的控制器,触发404。
解决步骤:
在Program.cs中配置Identity的自定义登录路径:
builder.Services.ConfigureApplicationCookie(options => { options.LoginPath = "/Login/Index"; // 指定你的登录页面路由 options.AccessDeniedPath = "/Login/AccessDenied"; // 可选:配置无权限页面 });
2. 完善登录逻辑的分支处理
当前登录逻辑中,若用户邮箱未确认,仅返回View但未注销用户,可能导致用户处于"已登录但未满足授权条件"的模糊状态,引发授权中间件异常跳转。
优化代码:
[HttpPost] public async Task<IActionResult> Index(LoginViewModel loginViewModel) { var result = await _signInManager.PasswordSignInAsync(loginViewModel.Username, loginViewModel.Password, false, true); if (result.Succeeded) { var user = await _userManager.FindByNameAsync(loginViewModel.Username); if (user.EmailConfirmed == true) { return RedirectToAction("Index", "MyAccounts"); } // 邮箱未确认时注销用户并提示 await _signInManager.SignOutAsync(); ModelState.AddModelError(string.Empty, "请先完成邮箱验证"); } else { ModelState.AddModelError(string.Empty, "用户名或密码错误"); } return View(); }
3. 验证中间件顺序
确保Program.cs中中间件顺序正确(身份验证必须在授权之前):
app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 先启用身份验证,再启用授权 app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
4. 确认身份验证状态(调试用)
在MyAccountsController的Index方法中添加调试代码,确认用户是否已被正确识别为已认证:
[HttpGet] public async Task<IActionResult> Index() { // 调试输出,确认认证状态 var isAuthenticated = User.Identity.IsAuthenticated; var currentUserName = User.Identity.Name; var values = await _userManager.FindByNameAsync(currentUserName); // 原有代码... return View(appUserEditDto); }
内容的提问来源于stack exchange,提问作者Berkay
相关产品推荐
相关产品推荐

