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

登录成功跳转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:43:19