ASP.NET Core LoginPath路由错误,如何正确指向/Login?
项目Controllers文件夹包含HomeController和LoginController两个控制器,使用Cookie身份验证时将LoginPath设置为/Login,期望路由到LoginController,但点击登录链接时应用却路由到Home/Login,需修正路由实现正确跳转。
当前路由配置
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapControllerRoute( name: "login", pattern: "{controller=Login}/{action=Login}");
LoginPath配置
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Login"; options.AccessDeniedPath = "/Home/Denied"; });
文件夹结构
Controllers/ ├── HomeController.cs └── LoginController.cs
修正方案
方案1:调整路由规则顺序并修改登录路由的匹配模式
路由匹配按注册顺序执行,需将登录专用路由放在默认路由之前,同时修改路由模式为精确匹配Login,确保/Login路径直接映射到LoginController的Login方法:
// 先注册登录专用路由 app.MapControllerRoute( name: "login", pattern: "Login", defaults: new { controller = "Login", action = "Login" }); // 再注册默认路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
方案2:使用属性路由(推荐)
直接在LoginController的Login方法上添加属性路由,无需依赖全局路由配置,更清晰直观:
public class LoginController : Controller { [Route("Login")] public IActionResult Login() { // 登录逻辑 return View(); } }
原理说明
原登录路由的{controller=Login}/{action=Login}模式,实际会匹配类似/Login/Login的路径,而非/Login。当访问/Login时,默认路由会先尝试将Login识别为控制器名称,若LoginController不存在Index方法,路由系统可能出现误匹配;调整路由顺序和模式,或使用属性路由,能确保/Login路径精准指向LoginController的Login方法。
内容的提问来源于stack exchange,提问作者user3552172
相关产品推荐
相关产品推荐

