使用Authorize后登录循环,无法跳转至HomeController求助
解决ASP.NET MVC登录循环问题
我帮你分析下问题所在,你遇到的登录循环问题主要是因为BaseController里的授权逻辑没有正确中断请求,再加上和[Authorize]特性的双重检查冲突导致的。
问题根源
- BaseController的OnActionExecuting方法错误:当
Session["UserId"]为空时,你调用了RedirectToAction,但没有把这个重定向结果赋值给filterContext.Result。这意味着MVC框架不会执行这个重定向,原请求会继续往下走。而HomeController带有[Authorize]特性,框架检测到未授权,就会再次重定向到Login页面,形成循环。 - 双重授权检查冲突:你同时使用了自定义的BaseController授权逻辑和
[Authorize]特性,两者的逻辑叠加导致了重定向的循环。
修复步骤
1. 修正BaseController的授权逻辑
修改BaseController的OnActionExecuting方法,确保在需要重定向时,将结果赋值给filterContext.Result,并且排除Login动作本身,防止无限循环:
public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { // 检查当前是否是Login动作,避免拦截登录请求 bool isLoginRequest = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.Equals("Login", StringComparison.OrdinalIgnoreCase) && filterContext.ActionDescriptor.ActionName.Equals("Login", StringComparison.OrdinalIgnoreCase); if (Session["UserId"] == null && !isLoginRequest) { // 必须将重定向结果赋值给filterContext.Result,才能中断原请求 filterContext.Result = RedirectToAction("Login", "Login"); return; } base.OnActionExecuting(filterContext); } }
2. 移除HomeController的[Authorize]特性
因为BaseController已经统一处理了授权检查,HomeController不需要再添加[Authorize],避免双重检查冲突:
public class HomeController : BaseController { public ActionResult Index() { return View(); } }
3. 确保Login的GET方法允许匿名访问
给Login的HttpGet方法添加[AllowAnonymous]特性,防止被BaseController的逻辑误拦截:
[AllowAnonymous] [HttpGet] public ActionResult Login() { return View(); }
原理说明
- 设置
filterContext.Result后,MVC框架会放弃原请求的执行,转而执行你指定的重定向结果,这样就不会触发[Authorize]特性的重定向了。 - 排除Login动作的检查,是为了避免在重定向到Login页面时,再次被BaseController拦截,导致无限循环。
内容的提问来源于stack exchange,提问作者Sagar padhiyar
相关产品推荐
相关产品推荐

