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

ASP.NET Core 2.2 MVC:区域内登录页设默认页遇404问题

嘿,我帮你梳理下这个404问题的根源,主要是路由配置顺序、区域标识缺失,还有属性路由与传统路由的冲突导致的,咱们一步步来解决:

问题根源拆解
  • 路由顺序搞反了:ASP.NET Core的路由是按注册顺序匹配的,你先注册了default路由,后注册区域路由,但区域路由的优先级应该更高,否则会导致区域内的控制器匹配失败。
  • 属性路由和传统路由冲突:你的AccountController同时用了[Route]属性路由和Startup里的传统路由,两种路由机制不能混用在同一个控制器上,这会让路由系统搞不清该用哪套规则匹配请求。
  • 默认路由没指定区域:你写的默认路由模板里有identity前缀,但没有明确指定area参数,路由系统无法识别这是Identity区域下的控制器。
解决方案(两种可选方案)

方案一:改用纯传统路由(推荐,更符合MVC区域路由的规范)

第一步:移除控制器上的属性路由

把AccountController里的[Route]特性全部删掉,因为我们要改用传统路由规则:

[Area("Identity")]
// 删掉这行:[Route("identity/[controller]")]
public class AccountController : BaseController {
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public AccountController(
        UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager ) {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    // GET: /Account/SignIn
    // 删掉这行:[Route("[action]")]
    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> SignIn(string returnUrl = null) {
        return View();
    }
}

第二步:调整Startup的路由顺序和配置

先注册区域路由(让区域路由优先匹配),再把默认路由直接映射到Identity区域的Account/SignIn:

app.UseMvc(routes => {
    // 先注册区域路由,确保区域内的控制器能被正确匹配
    routes.MapRoute(
        name: "areaRoute",
        template: "{area:exists}/{controller=Account}/{action=SignIn}/{id?}");

    // 根路径直接指向Identity区域的登录页
    routes.MapRoute(
        name: "default",
        template: "",
        defaults: new { area = "Identity", controller = "Account", action = "SignIn" });
});

方案二:保留属性路由(适合习惯用属性路由的场景)

如果你想继续用属性路由,只需要给SignIn方法加一个根路径的路由匹配规则,让/能直接命中这个Action:

[Area("Identity")]
[Route("identity/[controller]")]
public class AccountController : BaseController {
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public AccountController(
        UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager ) {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    // 增加[Route("/")],让根路径直接匹配这个登录方法
    [Route("/")]
    [Route("[action]")]
    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> SignIn(string returnUrl = null) {
        return View();
    }
}

然后Startup的路由配置可以简化,因为属性路由的优先级高于传统路由:

app.UseMvc(routes => {
    routes.MapRoute(
        name: "areaRoute",
        template: "{area:exists}/{controller}/{action}/{id?}");

    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});
测试验证

启动项目后访问根路径/,应该就能直接跳转到Identity区域的SignIn登录页,不会再出现404错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:31:51